home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 095 / 131abas.arc / RBBS-PC.BAS < prev   
BASIC Source File  |  1985-12-01  |  219KB  |  6,250 lines

  1. 3 ' $linesize: 132
  2. 4 ' $title: 'RBBS CPC13-1A, Copyright 1985 by D. Thomas Mack'
  3. 5 ' WARNING !!! DO NOT CHANGE, BYPASS OR REMOVE LINES 3-65
  4. 9 'by D. Thomas Mack                &   Jon J. Martin
  5. 10 '   The Second Ring                  Aircomm
  6. 11 '   10210 Oxfordshire Road           4396 N. Prairie Willow Ct.
  7. 12 '   Great Falls, Virginia 22066      Concord, California 94521
  8. 13 '
  9. 14 ' *******************************NOTICE*************************************
  10. 15 ' *  A limited license is granted to all users of this program and it's    *
  11. 16 ' *  companion program, CONFIG (version 1.9), to make copies of this       *
  12. 17 ' *  program and distribute the copies to other users, on the following    *
  13. 18 ' *  conditions:                                                           *
  14. 19 ' *    1.   The notices contained in lines 3 through 59 of the program     *
  15. 20 ' *         are not altered, bypassed, or removed.                         *
  16. 21 ' *    2.   The program is not to be disrtibuted to others in modified     *
  17. 22 ' *         form (i.e. the line numbers must remain the same).             *
  18. 23 ' *    3.   No fee is to be charged (or any other consideration received)  *
  19. 24 ' *         for coping or distributing these programs without an express   *
  20. 25 ' *         written agreement with D. Thomas Mack, The Second Ring, 10210  *
  21. 26 ' *         Oxfordshire Road, Great falls, Virginia 22006                  *
  22. 27 ' *                                                                        *
  23. 28 ' *   Copyright (c) 1983, 1984, 1985 D. Thomas Mack, The Second Ring       *
  24. 29 ' **************************************************************************
  25. 30 DEFINT A-Z
  26. 31 WIDTH 80
  27. 32 CLS
  28. 34 KEY OFF
  29. 35 LOCATE ,,0
  30. 36 PRINT TAB(60)"tm"
  31. 37 PRINT TAB(16) STRING$(15,205)" U S E R W A R E " STRING$(15,205)
  32. 38 PRINT
  33. 39 PRINT TAB(17)"Capital PC User Group User-Supported Software"
  34. 40 PRINT
  35. 41 PRINT TAB(5) CHR$(214) STRING$(66,196) CHR$(183)
  36. 42 FOR I = 1 TO 12
  37. 43   READ A$
  38. 44   PRINT TAB(5) CHR$(186);A$; SPACE$(66 - LEN(A$)); CHR$(186)
  39. 45 NEXT
  40. 46 PRINT TAB(5) CHR$(211) STRING$(66,196) CHR$(189)
  41. 47 PRINT TAB(21)"Copyright (c) 1983, 1984, 1985 Tom Mack, 10210 Oxfordshire Rd., Great Falls, VA"
  42. 48 DATA "    If you are using RBBS-PC CPC13.1 and find it valuable, I"
  43. 49 DATA "    suggest you consider a contribution to"
  44. 50 DATA ""
  45. 51 DATA "                 Capital PC Software Exchange"
  46. 52 DATA "                     Post Office Box 6128"
  47. 53 DATA "                Silver Spring, Maryland  20906"
  48. 54 DATA ""
  49. 55 DATA "    You are free to copy and share RBBS-PC CPC13.1 with"
  50. 56 DATA "    others on these three conditions:"
  51. 57 DATA "      1.  This program is not distributed in modified form."
  52. 58 DATA "      2.  No fee or consideration is charged for RBBS-PC, itself."
  53. 59 DATA "      3.  This notice is not bypassed or removed."
  54. 63 GOSUB 50510
  55. 65 GOSUB 50510
  56. 100 CLEAR:'                                               Erase all variables
  57.     ON ERROR GOTO 13000:'                                 Set ERROR trap
  58.     DEF SEG:'                                             Point to BASIC
  59.     CLS:'                                                 Clear Screen  
  60.     WIDTH 80:'                                            Set Screen Width
  61.     SCREEN 0,0,0:'                                        Text, No color, Pg 0
  62.     KEY OFF:'                                             Line 25 turned off
  63.     DEFINT A-Z:'                                          All var. integer
  64.     DIM A$(30):'                                          Message line table
  65.     DIM B$(128):'                                         Message line edits
  66.     DIM FILES.FUNCTION(10):'                              Files menu security
  67.     DIM HELP$(9):'                                        Help file names
  68.     DIM LG$(11):'                                         21 Work variables.
  69.     DIM M(250,2):'                                        Message pointers
  70.     DIM MAIN.FUNCTION(21):'                               Main menu security
  71.     DIM MENU$(6):'                                        Menu file names
  72.     DIM SYSOP.FUNCTION.KEY$(11):'                         Sysop Function keys
  73.     DIM SUBDIR$(99):'                                     Download Sub-Dirs
  74.     DIM SYSOP.FUNCTION(7):'                               Sysop menu security
  75.     DIM UTILITY.FUNCTION(16):'                            Utility menu security
  76.   ' ********************* Variable Definitions ********************************
  77.     ACKNOWLEDGE$ = CHR$(6)
  78.     ACTIVE.MESSAGE$=CHR$(225)
  79.     BACKSPACE$ = CHR$(8) + CHR$(32) + CHR$(8)
  80.     BACK.ARROW$ = CHR$(29) + CHR$(32) + CHR$(29)
  81.     CANCEL$ = CHR$(24)
  82.     COLOR.RESET$=CHR$(27)+"[00;33;40M"
  83.     CONFIG.FILENAME$ = "RBBS-PC.DEF"
  84.     CARRIAGE.RETURN$ = CHR$(13)
  85.     DELETED.MESSAGE$=CHR$(226)
  86.     END.TRANSMISSION$ = CHR$(4)
  87.     ESCAPE$ = CHR$(27)
  88.     FALSE = 0:'                                           Set FALSE condition
  89.     F1.KEY = 59
  90.     F10.KEY = 68
  91.     LINE.FEED$ = CHR$(10)
  92.     LINE.FEEDS = NOT FALSE
  93.     LOCK.STATUS$ = "UM UU UB UD"
  94.     NEGATIVE.ACKNOWLEDGE$ = CHR$(21)
  95.     OMNINET = 2:'
  96.     RIGHT.MARGIN = 72
  97.     RETURN.LINE.FEED$ = CARRIAGE.RETURN$ + LINE.FEED$
  98.     START.OF.HEADER$ = CHR$(1)
  99.     TIME.LOGGED.ON$ = SPACE$(8)
  100.     TRANSFER.OPTIONS$=" type <A)scii, <M>NP, <X>modem, <C>Xmodem/CRC, <Q>uit"
  101.     TRUE = NOT FALSE:'                                    Set TRUE condition
  102.     VERSION.ID$ = "CPC13.1A"
  103.     XOFF$ = CHR$(19)
  104.     XON$ = CHR$(17)
  105.   ' ******************** Logon Error Message Table ****************************
  106.     LG$(1) = "Registration Check Failed"
  107.     LG$(2) = "Sysop name attempted"
  108.     LG$(3) = "Locked out attempt"
  109.     LG$(4) = "Password Attempt Failed"
  110.     LG$(5) = "Auto Lockout done"
  111.     LG$(6) = "Name in use on another Node! "
  112.     LG$(7) = "300 Baud access not allowed!"  
  113. ' ***************** Predefined Function Definitions *************************
  114.   ' --- Convert 2 byte string to Integer 
  115.     DEF FN V(A1$,A) = VAL(MID$(A1$,A,2))
  116.   ' --- Create network Block Lock Semaphore
  117.     DEF FN BL$ = "BLK" + RIGHT$("0000" + MID$(STR$(BLK),2),5)
  118.   ' --- Test byte for specific bit turned on
  119.     DEF FN BT(Y,X) = (Y AND X) > 0
  120.   ' --- Convert MM/DD/YY to 3 byte field Chr$(YY) + Chr$(MM) + Chr$(DD)
  121.     DEF FN CD$(A1$) = CHR$(FN V(A1$,7)) + CHR$(FN V(A1$,1)) + CHR$(FN V(A1$,4))
  122.   ' --- Create YYMMDD string from MM/DD/YY string
  123.     DEF FN DC$(A1$) = RIGHT$(A1$,2) + LEFT$(A1$,2) + MID$(A1$,4,2)
  124.   ' --- Remove leading spaces from string field
  125.     DEF FN RS$(A1$)
  126.         WHILE LEFT$(A1$,1) = " " 
  127.               A1$ = MID$(A1$,2)
  128.         WEND
  129.         FN RS$ = A1$
  130.     END DEF           
  131.   ' --- Force Variable to specific length with spaces on right end
  132.     DEF FN S$(A1$,A) = A1$ + SPACE$(A-LEN(A1$))
  133.   ' --- Remove trailing spaces from string field
  134.     DEF FN SS$(A1$) = LEFT$(A1$ + SPACE$(2),INSTR(A1$ + SPACE$(2),SPACE$(2))-1)
  135.   ' --- Calculate seconds since midnight
  136.     DEF FN TI! = VAL(RIGHT$(TIME$,2)) + _
  137.                  VAL(RIGHT$(TIME$,5)) * 60 + _
  138.                  VAL(RIGHT$(TIME$,8)) * 3600
  139.   ' --- Convert lower to UPPER case
  140.     DEF FN UC$(CONVERT.FIELD$)
  141.         FOR Z = 1 TO LEN(CONVERT.FIELD$)
  142.             IF MID$(CONVERT.FIELD$,Z,1) > "@" THEN _
  143.                MID$(CONVERT.FIELD$,Z,1) = CHR$(ASC(MID$(CONVERT.FIELD$,Z,1)) AND 223)
  144.         NEXT
  145.         FN UC$=CONVERT.FIELD$
  146.     END DEF        
  147.   ' --- Convert 3 byte field Chr$(YY) + Chr$(MM) + Chr$(DD) to MM/DD/YY string
  148.     DEF FN UD$(A1$) = RIGHT$(STR$(ASC(MID$(A1$,2))),2) + _
  149.                       "/" + _
  150.                       RIGHT$(STR$(ASC(MID$(A1$,3))),2) + _
  151.                       "/" + _
  152.                       RIGHT$(STR$(ASC(A1$)),2)
  153. '
  154. ' *****************************************************************************
  155. ' *  GET NODE ID FROM COMMAND LINE                                            *
  156. ' *****************************************************************************
  157. '
  158.       PM$ = COMMAND$
  159.       IF LEN(PM$) = 0 THEN _
  160.          PM$ = "-"
  161.       NODE.RECORD.INDEX = INSTR("-1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ",LEFT$(PM$,1))
  162.       IF NODE.RECORD.INDEX < 2 THEN _
  163.          NODE.RECORD.INDEX = 2 : _
  164.          MID$(CONFIG.FILENAME$,5,1) = "-" : _
  165.          NODE.ID$ = "1" : _
  166.          GO TO 117
  167.       NODE.ID$ = STR$(NODE.RECORD.INDEX-1)
  168.       MID$(CONFIG.FILENAME$,5,1) = PM$
  169. '
  170. ' *****************************************************************************
  171. ' *  OPEN AND READ RBBS-PC CONFIGURATION DEFINITIONS                          *
  172. ' *****************************************************************************
  173. '
  174. 117 OPEN "I",2,CONFIG.FILENAME$
  175.     INPUT #2,DOWNLOAD.DRIVES$, _
  176.              SYSOP.PASSWORD.1$, _
  177.              SYSOP.PASSWORD.2$, _
  178.              SYSOP.FIRST.NAME$, _
  179.              SYSOP.LAST.NAME$, _
  180.              REQUIRED.RINGS, _
  181.              START.OFFICE.HOURS, _
  182.              END.OFFICE.HOURS, _
  183.              MINUTES.PER.SESSION!, _
  184.              DF, _
  185.              DF, _
  186.              UPLOAD.DIRECTORY$, _
  187.              EXPERT.USER, _
  188.              ACTIVE.BULLETINS, _
  189.              PROMPT.BELL, _
  190.              DF, _
  191.              DF, _
  192.              MENU$(1), _
  193.              MENU$(2), _
  194.              MENU$(3), _
  195.              MENU$(4), _
  196.              MENU$(5), _
  197.              CONFERENCE.MENU$, _
  198.              DF, _
  199.              WELCOME.INTERRUPTABLE, _
  200.              REMIND.FILE.TRANSFERS, _
  201.              PAGE.LENGTH, _
  202.              MAX.MESSAGE.LINES, _
  203.              DOORS.AVAILABLE, _
  204.              DF$
  205.     INPUT #2,MAIN.MESSAGE.FILE$, _
  206.              MAIN.MESSAGE.BACKUP$, _
  207.              CALLERS.FILE$, _
  208.              COMMENTS.FILE$, _
  209.              MAIN.USER.FILE$, _
  210.              WELCOME.FILE$, _
  211.              NEWUSER.FILE$, _
  212.              DIRECTORY.EXTENTION$, _
  213.              COM.PORT$, _
  214.              BULLETINS.OPTIONAL, _
  215.              MODEM.INIT.COMMAND$, _
  216.              DF$, _
  217.              DOS.VERSION, _
  218.              FG, _
  219.              BG, _
  220.              BORDER, _
  221.              RBBS.BAT$, _
  222.              RCTTY.BAT$
  223. 118 INPUT #2,OMIT.MAIN.DIRECTORY$, _
  224.              OMIT.UPLOAD.DIRECTORY$, _
  225.              HELP$(1), _
  226.              HELP$(2), _
  227.              HELP$(3), _
  228.              HELP$(4), _
  229.              HELP$(5), _
  230.              HELP$(6), _
  231.              HELP$(7), _
  232.              HELP$(8), _
  233.              HELP$(9), _
  234.              BULLETIN.MENU$, _
  235.              BULLETIN.PREFIX$, _
  236.              DF$, _
  237.              MESSAGE.REMINDER, _
  238.              REQUIRE.NON.ASCII, _
  239.              DOORS.SECURITY.LEVEL, _
  240.              MAXIUM.NUMBER.OF.NODES, _
  241.              NETWORK.TYPE, _
  242.              RECYCLE.TO.DOS, _
  243.              DF, _
  244.              DF!, _
  245.              TRASHCAN.FILE$
  246.     INPUT #2,MINIMUM.LOGON.SECURITY, _
  247.              DEFAULT.SECURITY.LEVEL, _
  248.              SYSOP.SECURITY.LEVEL, _
  249.              FILESEC.FILE$, _
  250.              SYSOP.MENU.SECURITY.LEVEL, _
  251.              LOCAL.PASSWORD$, _
  252.              MAXIMUM.VIOLATIONS, _
  253.              SYSOP.FUNCTION(1), _
  254.              SYSOP.FUNCTION(2), _
  255.              SYSOP.FUNCTION(3), _
  256.              SYSOP.FUNCTION(4), _
  257.              SYSOP.FUNCTION(5), _
  258.              SYSOP.FUNCTION(6), _
  259.              SYSOP.FUNCTION(7), _
  260.              PASSWORDS.FILE$, _
  261.              MAXIMUM.PASSWORD.CHANGES, _
  262.              MINIMUM.SECURITY.FOR.TEMP.PASSWORD, _
  263.              OVERWRITE.SECURITY.LEVEL, _
  264.              DOORS.TERMINAL.TYPE, _
  265.              LIMIT.DAILY.TIME
  266. 119 INPUT #2,MAIN.FUNCTION(1), _
  267.              MAIN.FUNCTION(2), _
  268.              MAIN.FUNCTION(3), _
  269.              MAIN.FUNCTION(4), _
  270.              MAIN.FUNCTION(5), _
  271.              MAIN.FUNCTION(6), _
  272.              MAIN.FUNCTION(7), _
  273.              MAIN.FUNCTION(8), _
  274.              MAIN.FUNCTION(9), _
  275.              MAIN.FUNCTION(10), _
  276.              MAIN.FUNCTION(11), _
  277.              MAIN.FUNCTION(12), _
  278.              MAIN.FUNCTION(13), _
  279.              MAIN.FUNCTION(14), _
  280.              MAIN.FUNCTION(15), _
  281.              MAIN.FUNCTION(16), _
  282.              MAIN.FUNCTION(17), _
  283.              MAIN.FUNCTION(18), _
  284.              MAIN.FUNCTION(19), _
  285.              MAIN.FUNCTION(20), _
  286.              MAIN.FUNCTION(21), _
  287.              DEFAULT.MACHINE.TYPE$, _
  288.              WAIT.BEFORE.DISCONNECT
  289. 121 INPUT #2,FILES.FUNCTION(1), _
  290.              FILES.FUNCTION(2), _
  291.              FILES.FUNCTION(3), _
  292.              FILES.FUNCTION(4), _
  293.              FILES.FUNCTION(5), _
  294.              FILES.FUNCTION(6), _
  295.              FILES.FUNCTION(7), _
  296.              FILES.FUNCTION(8), _
  297.              FILES.FUNCTION(9), _
  298.              FILES.FUNCTION(10), _
  299.              UTILITY.FUNCTION(1), _
  300.              UTILITY.FUNCTION(2), _
  301.              UTILITY.FUNCTION(3), _
  302.              UTILITY.FUNCTION(4), _
  303.              UTILITY.FUNCTION(5), _
  304.              UTILITY.FUNCTION(6), _
  305.              UTILITY.FUNCTION(7), _
  306.              UTILITY.FUNCTION(8), _
  307.              UTILITY.FUNCTION(9), _
  308.              UTILITY.FUNCTION(10), _
  309.              UTILITY.FUNCTION(11), _
  310.              UTILITY.FUNCTION(12), _
  311.              UTILITY.FUNCTION(13), _
  312.              UTILITY.FUNCTION(14), _
  313.              UTILITY.FUNCTION(15), _
  314.              UTILITY.FUNCTION(16), _
  315.              UPLOAD.TIME.FACTOR!, _
  316.              COMPUTER.TYPE, _
  317.              REMIND.PROFILE, _
  318.              RBBS.NAME$, _
  319.              COMMANDS.BETWEEN.RINGS, _
  320.              MNP.SUPPORT, _
  321.              PAGING.PRINTER.SUPPORT$, _
  322.              MODEM.INIT.BAUD$
  323.     FOR FUNCTION.KEY.INDEX = 1 TO 11
  324.       INPUT #2,SYSOP.FUNCTION.KEY$(FUNCTION.KEY.INDEX)
  325.     NEXT
  326. '
  327. ' *****************************************************************************
  328. ' *  ESTABLISH COMMUNICATION PORT REGISTERS AND COMMANDS                      *
  329. ' *  GET DOS SUB-DIRECTORY RBBS-PC OPTIONS                                    *
  330. ' *****************************************************************************
  331. '
  332. 122 INPUT #2, DF,_
  333.               SUBDIR.COUNT,_
  334.               DF,_
  335.               UPLOAD.TO.SUBDIR,_
  336.               DF,_
  337.               UPLOAD.SUBDIR$,_
  338.               RESTRICT.BAUD,_
  339.               USE.COLOR,_
  340.               DISKFULL.GO.OFFLINE,_
  341.               EXTENDED.LOGGING,_
  342.               MODEM.RESET.COMMAND$,_
  343.               MODEM.COUNT.RINGS.COMMAND$,_
  344.               MODEM.ANSWER.COMMAND$,_
  345.               MODEM.GO.OFFHOOK.COMMAND$,_
  346.               DISK.FOR.DOS$, _
  347.               DUMB.MODEM, _
  348.               LSB,_
  349.               MSB,_
  350.               LINE.CONTROL.REGISTER,_
  351.               MODEM.CONTROL.REGISTER,_
  352.               LINE.STATUS.REGISTER,_
  353.               MODEM.STATUS.REGISTER
  354. '
  355. ' *****************************************************************************
  356. ' *  ESTABLISH RBBS-PC'S DOS SUBDIRECTORIES USAGE                             *
  357. ' *****************************************************************************
  358. '
  359.     IF SUBDIR.COUNT<1 THEN _
  360.        GOTO 123
  361.     FOR SUBDIR.INDEX = 1 TO SUBDIR.COUNT
  362.         INPUT #2,SUBDIR$
  363.         SUBDIR$(SUBDIR.INDEX) = SUBDIR$ + "\"
  364.     NEXT
  365.     GOTO 125
  366. '
  367. ' *****************************************************************************
  368. ' *  SETUP DOWNLOAD DRIVES WITH NO SUBDIRECTORY SUPPORT                       *
  369. ' *****************************************************************************
  370. '
  371. 123 FOR SUBDIR.INDEX = 1 TO LEN(DOWNLOAD.DRIVES$) - 1
  372.         SUBDIR$(SUBDIR.INDEX) = MID$(DOWNLOAD.DRIVES$,SUBDIR.INDEX,1) + ":"
  373.     NEXT
  374.     SUBDIR.COUNT = LEN(DOWNLOAD.DRIVES$) - 1
  375. '
  376. ' *****************************************************************************
  377. ' *  SETUP UPLOAD DRIVE AND DIRECTORY.NAME                                    *
  378. ' *****************************************************************************
  379. '
  380. 125 UPLOAD.DIR.CHECK$ = FN S$(UPLOAD.DIRECTORY$,8)
  381.     SUBDIR.COUNT = SUBDIR.COUNT + 1
  382.     IF UPLOAD.TO.SUBDIR THEN _
  383.        SUBDIR$(SUBDIR.COUNT) = UPLOAD.SUBDIR$ + "\" _
  384.     ELSE SUBDIR$(SUBDIR.COUNT) = RIGHT$(DOWNLOAD.DRIVES$,1) + _
  385.          ":"
  386.     UPLOAD.DIRECTORY$ = SUBDIR$(SUBDIR.COUNT) + _
  387.                         UPLOAD.DIRECTORY$ + _
  388.                         "." + _
  389.                         DIRECTORY.EXTENTION$
  390. '
  391. ' *****************************************************************************
  392. ' *  INITIALIZE OMNINET INTERFACE IF OMNINET IN USE                           *
  393. ' *****************************************************************************
  394. '
  395. 128 IF NETWORK.TYPE = OMNINET THEN _
  396.        CN$ = SPACE$(535) : _
  397.        CALL INITIO(A)
  398. '
  399. ' *****************************************************************************
  400. ' *  ESTABLISH NEXT CALLERS FILE RECORD AVAILABLE                             *
  401. ' *****************************************************************************
  402. '
  403.     GOSUB 56000
  404.     CALLERS.FILE.INDEX = LOF(4) / 64
  405. 130 GET 4,CALLERS.FILE.INDEX
  406.     IF LEFT$(CALLERS.RECORD$,13) = STRING$(13,0) THEN _
  407.        CALLERS.FILE.INDEX = CALLERS.FILE.INDEX-1 : _
  408.        GOTO 130
  409. '
  410. ' *****************************************************************************
  411. ' *  TEST FOR MESSAGE FILE PRESENT (ABORT IF NOT PRESENT)                     *
  412. ' *****************************************************************************
  413. '
  414. 135 ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$
  415.     ACTIVE.USER.FILE$ = MAIN.USER.FILE$
  416.     GOSUB 4910
  417.     GET 1,NODE.RECORD.INDEX
  418.     MID$(MESSAGE.RECORD$,57,1)="I"
  419.     PUT 1,NODE.RECORD.INDEX
  420.     GOSUB 21996
  421. '
  422. ' *****************************************************************************
  423. ' *  TEST FOR COLOR GRAPHICS MONITOR AND ANSI.SYS SUPPORT TO ALLOW THE LOCAL  *
  424. ' *  SYSOP TO SEE THE SAME COLOR MENUS AND SCREENS THAT THE REMOTE USER SEES  *
  425. ' *****************************************************************************
  426. '
  427.     DEF SEG = 0
  428.     IF (PEEK(&H410) AND &H30) <> &H30 AND _
  429.        USE.COLOR THEN _
  430.        COLOR.SUPPORT = TRUE : _
  431.        A$ = COLOR.RESET$ : _
  432.        LOCAL.USER = TRUE : _
  433.        GOSUB 1405 : _
  434.        LOCAL.USER = FALSE
  435. '
  436. ' *****************************************************************************
  437. ' *  TEST FOR MULTI LINK PRESENT IF NOT COMPAQ COMPUTER                       *
  438. ' *****************************************************************************
  439. '
  440.     IF COMPUTER.TYPE <> 1 THEN _
  441.        MULTI.LINK.PRESENT = PEEK(&H1FE) + 256*PEEK(&H1FF) : _
  442.        IF MULTI.LINK.PRESENT > 0 THEN _
  443.           DEF SEG = MULTI.LINK.PRESENT : _
  444.           MULTI.LINK.COM.PORT = (&H64 + PEEK(&H58) + 256*PEEK(&H59) + &HC) : _
  445.           IF PEEK(MULTI.LINK.COM.PORT) = &H1 OR &H2 THEN _
  446.              POKE (MULTI.LINK.COM.PORT),&H9
  447. '
  448. ' *****************************************************************************
  449. ' *  RESET MULTI LINK SPECIAL PARAMETERS TO NORMAL (NOT EXIT TO DOORS)        *
  450. ' *****************************************************************************
  451. '
  452.     DEF SEG
  453.     IF MULTI.LINK.PRESENT THEN _
  454.        AX = &HB00 : _                   ' Turn off ML's carrier monitoring.
  455.        BX = 0 : _
  456.        GOSUB 60510 : _
  457.        AX = &H701 : _                   ' Change terminal type to ML type 1.
  458.        BX = 0 : _
  459.        GOSUB 60510 : _
  460.        AX = &H1 : _                     ' Conditionally enque on comm. port 
  461.        GOSUB 60505
  462.     IF NOT MNP.SUPPORT THEN _
  463.        TRANSFER.OPTIONS$ = MID$(TRANSFER.OPTIONS$,1,14) + _
  464.                            MID$(TRANSFER.OPTIONS$,22)
  465. '
  466. ' *****************************************************************************
  467. ' *  DISPLAY RBBS-PC MAIN FUNCTION KEY DISPLAY                                *
  468. ' *****************************************************************************
  469. '
  470. 170 PRINT "RBBS-PC VERSION ";VERSION.ID$;" Node ";NODE.ID$
  471.     PRINT "Free memory: "; FRE("A")
  472.     PRINT
  473.     PRINT"Press:"
  474.     FOR FUNCTION.KEY.INDEX = 1 TO 11
  475.       PRINT SYSOP.FUNCTION.KEY$(FUNCTION.KEY.INDEX)
  476.       IF FUNCTION.KEY.INDEX < 11 THEN _
  477.          KEY FUNCTION.KEY.INDEX,""
  478.     NEXT
  479. '
  480. ' *****************************************************************************
  481. ' * IF RUNNING MORE THAN ONE NODE IN A DOS 3.X ENVIRONMENT (OR HIGHER) UNDER  *
  482. ' * MULTILINK, THEN SET THE "SHARE.IT" INDICATOR ON SO THAT ALL FILES CAN BE  *
  483. ' * ACCESSED BY ALL PARTITIONS IN A MULTI-TASKING ENVIRONMENT (I.E. MULTI-    *
  484. ' * LINK).                                                                    *
  485. ' *****************************************************************************
  486. '
  487.     IF DOS.VERSION > 2 AND _
  488.        MAXIMUM.NUMBER.OF.NODES > 1 AND _
  489.        MULTI.LINK.PRESENT THEN _
  490.           SHARE.IT = TRUE
  491. '
  492. ' *****************************************************************************
  493. ' *  GET CURRENT STATUS OF SYSOP AVAIL, SYSOP ANNOY, SYSOP NEXT, & PRINTER    *
  494. ' *****************************************************************************
  495. '
  496. 175 GOSUB 30500
  497.     GET 1,NODE.RECORD.INDEX
  498.     SYSOP.AVAILABLE = FN V(MESSAGE.RECORD$,32)
  499.     SYSOP.ANNOY = FN V(MESSAGE.RECORD$,34)
  500.     SYSOP.NEXT = FN V(MESSAGE.RECORD$,36)
  501.     PRINTER = FN V(MESSAGE.RECORD$,38)
  502.     EXIT.TO.DOORS = FN V(MESSAGE.RECORD$,40)
  503.     SNOOP = FN V(MESSAGE.RECORD$,58)
  504.     GOSUB 950
  505. '
  506. ' *****************************************************************************
  507. ' *  INITIALIZE MODEM AND ANNOUNCE RBBS-PC IS UP AND READY FOR CALLS          *
  508. ' *****************************************************************************
  509. '
  510. 200 IF INP(MODEM.STATUS.REGISTER) < 128 THEN _
  511.        OUT MODEM.CONTROL.REGISTER,&H4 : _
  512.        GOSUB 50500 : _
  513.        OUT MODEM.CONTROL.REGISTER,&H0
  514. 210 OPEN COM.PORT$ + ":" + MODEM.INIT.BAUD$ + ",N,8,1,RS,CD,DS" AS #3
  515. 220 GOSUB 41500
  516. 230 IF PRINTER THEN _
  517.        LPRINT "RBBS-PC VERSION ";VERSION.ID$;" Node ";NODE.ID$;" up at ";TIM$;" on "; DATE$
  518. 235 EIGHT.BIT = TRUE
  519.     IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  520.        GOSUB 44000 : _
  521.        GOTO 410
  522.     A$ = MODEM.RESET.COMMAND$
  523.     GOSUB 52070
  524.     IF COMPUTER.TYPE = 2 AND COM.PORT$ = "COM1" AND MODEM.STATUS.REGISTER = 1022 THEN _
  525.        FOR I = 1 TO 3 : _
  526.          GOSUB 50510 : _ 
  527.        NEXT
  528.     GOSUB 50510
  529.     A$ = MODEM.INIT.COMMAND$
  530.     GOSUB 52070
  531.     PRINT
  532.     PRINT "READY FOR CALLS AT ";TIM$;" ON "; DATE$
  533.     PRINT
  534.     PRINT "<SCREEN CLEARS TO PREVENT BURN IN>"
  535.     PRINT
  536.     IF RESTRICT.BAUD THEN _
  537.        PRINT "300 BAUD NOT ALLOWED   ";
  538.     IF COLOR.SUPPORT THEN _
  539.        PRINT "ANSI COLOR SUPPORT ACTIVE   ";
  540.     IF EXTENDED.LOGGING THEN _
  541.        PRINT "EXTENDED CALLER LOGGING"
  542.     PRINT
  543.     IF REQUIRED.RINGS = 0 THEN PRINT "WAITING FOR CARRIER"
  544.     IF REQUIRED.RINGS = 255 THEN PRINT "RING BACK SYSTEM SPECIFIED"
  545.     IF REQUIRED.RINGS > 0 AND _
  546.        REQUIRED.RINGS < 255 THEN _
  547.        PRINT "WAITING FOR RING ";REQUIRED.RINGS
  548. '
  549. ' *****************************************************************************
  550. ' *  GET READY TO ANSWER INCOMMING CALL:                                      *
  551. ' *       1.  LET THE MODEM "AUTO-ANSWER" FOR RBBS-PC.                        *
  552. ' *           REQUIRED RINGS = 0 AND S0 = 1 IN MODEM INIT COMMAND.            *
  553. ' *       2.  ANSWER THE MODEM ON A SPECIFIED NUMBER OF RINGS.                *
  554. ' *           REQUIRED RINGS > 0 AND S0 = 0 IN MODEM INIT COMMAND.            *
  555. ' *       3.  ANSWER THE MODEM ON A SPECIFIED NUMBER OF RINGS AFTER A USER    *
  556. ' *           FIRST CALLS AND THEN HANGS UP (I.E. RING-BACK).                 *
  557. ' *           REQUIRED RINGS > 0 AND S0 = 255 IN MODEM INIT COMMAND.          *
  558. ' *****************************************************************************
  559. '
  560.     TCA! = FN TI!
  561.     GOSUB 49000
  562.     QQ = 255
  563.     I = INSTR(MODEM.INIT.COMMAND$,"S0")
  564.     IF I = 0 THEN _
  565.        GOTO 239
  566.     IF VAL(MID$(MODEM.INIT.COMMAND$,I+3,3)) = 255 THEN _
  567.        QQ = 0 : _
  568.        BLK = QQ
  569. 239 RINGBACK.WAIT.STARTED! = 0
  570.     IF REQUIRED.RINGS > 0 AND QQ=0 THEN _
  571.        RINGBACK.WAIT.STARTED! = FN TI! : _
  572.        COLOR 7,0,0 _
  573.     ELSE COLOR FG,BG,BORDER
  574. 240 IF SYSOP.NEXT THEN _
  575.        GOTO 826
  576.     X = 1
  577. '
  578. ' *****************************************************************************
  579. ' * WAIT FOR INCOMING CALLS                                                   *
  580. ' *****************************************************************************
  581. '
  582.     WHILE INP(MODEM.STATUS.REGISTER) < 128
  583.       GOSUB 60000
  584. 250   IF KEY.PRESSED$ = ESCAPE$ THEN _
  585.          GOTO 826
  586. 260   IF RINGBACK.WAIT.STARTED! > 0 THEN _
  587.          IF FN TI! - RINGBACK.WAIT.STARTED! > 45 THEN _
  588.             RINGBACK.WAIT.STARTED! = 0 : _
  589.             RING.BACK.COUNT = 0 : _
  590.             Q = 0 : _
  591.             IF (SNOOP AND REQUIRED.RINGS) THEN _
  592.                PRINT "Ringback timeout";PAGING.PRINTER.SUPPORT$ : _
  593.                IF BLK THEN _
  594.                   QQ = 0 _
  595.                ELSE QQ = 255
  596. 265   IF FN TI! - TCA! > 120 THEN _
  597.          LOCATE ,,0 : _
  598.          CLS : _
  599.          TCA! = FN TI!
  600. 266   IF (INP(MODEM.STATUS.REGISTER) AND &H40) > 0 AND _
  601.          REQUIRED.RINGS > 0 THEN _
  602.          GOTO 275
  603. 270 WEND
  604.     IF REQUIRED.RINGS = 0 THEN _
  605.        GOTO 321
  606. '
  607. ' *****************************************************************************
  608. ' * PREPARE TO ANSWER THIS CALL ON A SPECIFIED NUMBER OF RINGS (S0 = 0) OR    *
  609. ' * THE CALL AFTER THIS CALL ON A SPECIFIED NUMBER OF RINGS (S0 = 255) --     *
  610. ' * "RING BACK."                                                              *
  611. ' *****************************************************************************
  612. '
  613. 275 IF LOC(3) THEN _
  614.        X$ = INPUT$(LOC(3),3)
  615.     A$ = MODEM.COUNT.RINGS.COMMAND$
  616.     GOSUB 52070
  617.     GOSUB 50500
  618. 290 X$ = INPUT$(LOC(3),3)
  619.     IF LEN(X$) = 0 THEN _
  620.        X$=STR$(RING.BACK.COUNT)
  621.     A$ = ""
  622.     IF QQ = 0 AND Q < VAL(X$) THEN _   
  623.        Q = VAL(X$) : _
  624.        GOTO 305
  625. 300 RING.BACK.COUNT = RING.BACK.COUNT + 1
  626.     A$ = STR$(RING.BACK.COUNT)
  627.     IF QQ = 0 THEN _
  628.        RING.BACK.COUNT = VAL(X$) : _
  629.        A$ = STR$(RING.BACK.COUNT)
  630. 305 IF SNOOP THEN _
  631.        PRINT TIME$ + " Ring " + A$ + PAGING.PRINTER.SUPPORT$
  632. 310 IF RING.BACK.COUNT < REQUIRED.RINGS THEN _
  633.        GOTO 239
  634. 320 A$ = MODEM.ANSWER.COMMAND$
  635.     GOSUB 52070
  636. '
  637. ' *****************************************************************************
  638. ' *  TEST FOR CARRIER PRESENT                                                 *
  639. ' *****************************************************************************
  640. '
  641. 321 CONNECT.DELAY! = FN TI! + 30
  642.     MODEM.RESPONSE$ = ""
  643. 322 IF INP(MODEM.STATUS.REGISTER) < 128 AND _
  644.        FN TI! < CONNECT.DELAY! THEN _
  645.        GOTO 322
  646.     IF INP(MODEM.STATUS.REGISTER) < 128 THEN _
  647.        GOTO 10595
  648.     GOSUB 50510
  649. 324 MODEM.RESPONSE$ = MODEM.RESPONSE$ + INPUT$(LOC(3),3)
  650.     PRINT MODEM.RESPONSE$
  651.     IF FN TI! > CONNECT.DELAY! THEN _
  652.        Z$ = "Connect timeout" : _
  653.        GOSUB 13665 : _
  654.        GOTO 10595
  655. 325 IF DUMB.MODEM THEN _
  656.        BAUD.TEST = VAL(MODEM.INIT.BAUD$) : _
  657.        GOTO 330
  658.     IF INSTR(MODEM.RESPONSE$,"CONNECT") THEN _
  659.        BAUD.TEST = VAL(MID$(MODEM.RESPONSE$,INSTR(MODEM.RESPONSE$,"CONNECT") + 8,4)) : _
  660.        GOTO 330
  661.     GOTO 324
  662. '
  663. ' *****************************************************************************
  664. ' *  DETERMINE BAUD RATE                                                      *
  665. ' *****************************************************************************
  666. '
  667. 330 GOSUB 21280
  668.     IF BAUD.TEST = 0 OR BAUD.TEST = 300 THEN _
  669.        BAUD.RATE.DIVISOR = &H180 : _
  670.        BPS = -1 : _
  671.        GOSUB 1654 _
  672.     ELSE IF BAUD.TEST = 1200 OR BAUD.TEST = 2400 THEN _
  673.             BPS = -2-(BAUD.TEST / 1200) : _
  674.             BAUD.RATE.DIVISOR = 48 * (BPS + 5) : _
  675.             GOSUB 1654 _
  676.          ELSE 324
  677. '
  678. ' *****************************************************************************
  679. ' *  DISPLAY WELCOME LINE                                                     *
  680. ' *****************************************************************************
  681. '
  682. 345 GOSUB 41500
  683.     USER.LOGON.TIME! = FN TI!
  684.     TIME.LOGGED.ON$ = TIME$
  685.     A$ = "WELCOME TO " + RBBS.NAME$ + CARRIAGE.RETURN$
  686.     GOSUB 1399
  687.     TEST.PARITY = TRUE
  688.     FILE.NAME$ = LEFT$(WELCOME.FILE$,2) + "PRELOG"
  689. 346 NAME FILE.NAME$ AS FILE.NAME$
  690. 347 BYPASS.TIME.CHECK = TRUE
  691.     GOSUB 43030
  692.     GOSUB 6000
  693.     BYPASS.TIME.CHECK = FALSE
  694.     FF = FALSE
  695. '
  696. ' *****************************************************************************
  697. ' *  GET USER NAME                                                            *
  698. ' *  C - COMMAND FROM NEWUSER REGISTER OPTIONS (CHANGE NAME OR ADDRESS)       *
  699. ' *****************************************************************************
  700. '
  701. 400 UPPER.CASE = FALSE
  702.     A1$ = "What is your "
  703.     GOSUB 12500
  704.     BAUD.PARITY$ = MID$("    300 45012002400",(-4*BPS),4) + _
  705.                    " BAUD," + _
  706.                    MID$("N,8,1E,7,1",6 + 5*EIGHT.BIT,5)
  707.     IF FF THEN _
  708.        LOGON.ERROR.INDEX = 1 : _
  709.        GOTO 10620
  710.     IF RESTRICT.BAUD THEN _
  711.        IF BPS = -1 THEN _
  712.           LOGON.ERROR.INDEX = 7 : _
  713.           GOTO 10620
  714. '
  715. ' *****************************************************************************
  716. ' *  CHECK IF SAME USER ON ANOTHER NODE                                       *
  717. ' *****************************************************************************
  718. '
  719. 410 FOR NODE.INDEX = 2 TO NODES.IN.SYSTEM + 1
  720.       GET 1,NODE.INDEX
  721.       IF INSTR(MESSAGE.RECORD$,ACTIVE.USER.NAME$) THEN _
  722.          IF MID$(MESSAGE.RECORD$,57,1) = "A" THEN _
  723.             LOGON.ERROR.INDEX = 6 : _
  724.             LG$(6) = LG$(6) + LEFT$(MESSAGE.RECORD$,25) : _
  725.             GOTO 10620 _
  726.          ELSE A$ = "Welcome back, " + _
  727.                     LEFT$(MESSAGE.RECORD$,INSTR(MESSAGE.RECORD$," ")-1) + _ 'CPC131AB
  728.                     "!" : _
  729.               GOSUB 1399 : _
  730.               GOTO 430
  731. 420 NEXT
  732. '
  733. ' *****************************************************************************
  734. ' *  TEST FOR REMOTE SYSOP LOGGING ON                                         *
  735. ' *****************************************************************************
  736. '
  737. 430 GET 1,NODE.RECORD.INDEX
  738.     LL = (ACTIVE.USER.NAME$ = LEFT$(MESSAGE.RECORD$,LEN(ACTIVE.USER.NAME$)))
  739.     IF FIRST.NAME$ = SYSOP.PASSWORD.1$ AND _
  740.        LAST.NAME$ = SYSOP.PASSWORD.2$ THEN _
  741.        UPPER.CASE = FALSE : _
  742.        CI$ = "REMOTE" : _
  743.        GOTO 827
  744. '
  745. ' *****************************************************************************
  746. ' *  TEST FOR SYSOP NAME ATTEMPT                                              *
  747. ' *****************************************************************************
  748. '
  749. 445 IF INSTR(ACTIVE.USER.NAME$,"SYSOP") OR _
  750.        INSTR(ACTIVE.USER.NAME$,SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$) THEN _
  751.        LOGON.ERROR.INDEX = 2 : _
  752.        GOTO 10620
  753. '
  754. ' *****************************************************************************
  755. ' *  REMOVE INVALID CHARACTERS FROM USER NAME                                 *
  756. ' *****************************************************************************
  757. '
  758. 455 FOR J = 1 TO LEN(ACTIVE.USER.NAME$)
  759.       X = ASC(MID$(ACTIVE.USER.NAME$,J,1))
  760.       IF (X < 65 OR X > 90) AND _
  761.          (X <> 32 AND X <> 39 AND X <> 45 AND X <> 46) THEN _
  762.          GOTO 400
  763. 465 NEXT
  764. '
  765. ' *****************************************************************************
  766. ' *  CHECK FOR ACTIVE USER                                                    *
  767. ' *****************************************************************************
  768. '
  769.     TEMP.USER.NAME$ = ACTIVE.USER.NAME$
  770.     GOSUB 12600
  771.     IF NOT FOUND THEN _
  772.        GOTO 700
  773.     GOSUB 21995
  774. '
  775. ' *****************************************************************************
  776. ' *  ACTIVE USER FOUND                                                        *
  777. ' *****************************************************************************
  778. '
  779.     GOSUB 9500
  780.     USER.FILE.INDEX = LOC(2)
  781.     IF USER.SECURITY.LEVEL < MINIMUM.LOGON.SECURITY THEN _
  782.        GOTO 725   
  783.     GOSUB 26500
  784.     CI$ = CITY.STATE$
  785.     ATTEMPTS.ALLOWED = 4
  786.     PASSWORD.SAVE$ = PASSWORD$
  787.     MESSAGE.PASSWORD = FALSE
  788.     IF CURRENT.DATE$ <> LEFT$(LAST.DATE.TIME.ON$,8) THEN _
  789.        ELAPSED.TIME = 0 _
  790.     ELSE ELAPSED.TIME = CVI(ELAPSED.TIME$)
  791. 480 IF Q = 3 THEN _
  792.        Z$ = B$(3) : _
  793.        ATTEMPTS = 1 : _
  794.        GOSUB 677 _
  795.     ELSE GOSUB 675
  796. 630 IF PASSWORD.FAILED THEN _
  797.        LOGON.ERROR.INDEX = 4 : _
  798.        GOTO 10620
  799. 643 GOSUB 41070
  800.     NEW.USER = FALSE
  801.     LM$ = FN DC$(FN UD$(LIST.NEW.DATE$))
  802.     IF MID$(LM$,3,1) = " " THEN _
  803.        MID$(LM$,3,1) = "0"
  804. 655 IF MID$(LM$,5,1) = " " THEN _
  805.        MID$(LM$,5,1) = "0"
  806. 660 GOTO 800
  807. '
  808. ' *****************************************************************************
  809. ' *  USER & MESSAGE PASSWORD VALIDATION                                       *
  810. ' *****************************************************************************
  811. '
  812. 665 IF PASSWORD.SAVE$ = PASSWORD$ THEN _
  813.        PASSWORD.FAILED = 0 : _
  814.        RETURN
  815. 667 ATTEMPTS = 0
  816. 670 ATTEMPTS = ATTEMPTS + 1
  817.     IF ATTEMPTS > ATTEMPTS.ALLOWED THEN _
  818.        PASSWORD.FAILED = TRUE : _
  819.        RETURN
  820. 675 A$ = "Enter Password (dots will echo)"
  821.     GOSUB 45010
  822.     Z$ = B$(1)
  823. 677 IF LEN(Z$) > 15 THEN _
  824.        GOTO 680
  825.     Z$ = FN UC$(Z$)
  826.     Z$ = FN S$(Z$,15)
  827.     IF PASSWORD.SAVE$ = Z$ THEN _
  828.        PASSWORD.FAILED = 0 : _
  829.        RETURN
  830. 680 IF MESSAGE.PASSWORD THEN _
  831.        A$ = "Wrong password entered!" : _
  832.        GOSUB 1405
  833.     GOTO 670
  834. '
  835. ' *****************************************************************************
  836. ' *  ACTIVE USER NOT FOUND (NEWUSER ROUTINE)                                  *
  837. ' *****************************************************************************
  838. '
  839. 700 Z$ = FIRST.NAME$
  840.     GOSUB 12570
  841.     IF FOUND THEN _
  842.        GOSUB 21995 : _
  843.        GOTO 12595
  844.     Z$ = LAST.NAME$
  845.     GOSUB 12570
  846.     IF FOUND THEN _
  847.        GOSUB 21995 : _
  848.        GOTO 12595
  849. 710 IF USER.FILE.INDEX = 0 THEN _
  850.        GOTO 13540
  851. 720 NEW.USER = TRUE
  852.     GOSUB 9400
  853.     GOSUB 12630
  854.     LSET USER.NAME$ = "NEWUSER"
  855.     PUT 2,USER.FILE.INDEX
  856.     USER.SECURITY.LEVEL = DEFAULT.SECURITY.LEVEL
  857. 725 IF USER.SECURITY.LEVEL < MINIMUM.LOGON.SECURITY OR _
  858.        FIRST.NAME$ = LAST.NAME$ THEN _
  859.        LOGON.ERROR.INDEX = 3 : _
  860.        GOTO 10620
  861. 730 GOSUB 12950
  862.     USER.RECORD.SAVE$ = USER.RECORD$
  863.     BYPASS.TIME.CHECK = TRUE
  864.     FILE.NAME$ = NEWUSER.FILE$
  865.     STOP.INTERRUPTS = FALSE
  866.     GOSUB 1790
  867.     STOP.INTERRUPTS = TRUE
  868.     BYPASS.TIME.CHECK = FALSE
  869.     GOSUB 9400
  870.     LSET USER.RECORD$ = USER.RECORD.SAVE$
  871.     A$ = ACTIVE.USER.NAME$ + " from " + CITY.STATE$
  872.     GOSUB 1405
  873. 740 A$ = "<C>hange name/address, <D>isconnect (don't register), <R>egister"
  874.     GOSUB 1500
  875.     Z$ = FN UC$(B$(1))
  876.     S = INSTR("CDR",Z$)
  877. 745 ON S GOTO 747,750,755
  878.     GOTO 740
  879. 747 Z$ = ACTIVE.USER.NAME$ + " from " + CI$ + " changed Name/Address"
  880.     GOSUB 13670
  881.     LSET USER.NAME$ = STRING$(31,0)
  882.     PUT 2,USER.FILE.INDEX
  883.     GOSUB 27500
  884.     FF = FALSE
  885.     GOTO 400
  886. '
  887. ' *****************************************************************************
  888. ' *  D - COMMAND FROM NEWUSER ROUTINE (DISCONNECT - REFUSE TO REGISTER)       *
  889. ' *****************************************************************************
  890. '
  891. 750 Z$ = ACTIVE.USER.NAME$ + " of " + CI$ + " refused to register"
  892.     GOSUB 13670
  893.     LSET USER.NAME$ = STRING$(31,0)
  894.     PUT 2,USER.FILE.INDEX
  895.     GOSUB 27500
  896.     FF = FALSE
  897.     USER.FILE.INDEX = 0
  898.     GOTO 13540
  899. '
  900. ' *****************************************************************************
  901. ' *  R - COMMAND FROM NEWUSER ROUTINE (REGISTER)                              *
  902. ' *****************************************************************************
  903. '
  904. 755 GOSUB 12800
  905.     A$ = "Re-enter PASSWORD for verification (Dots will Echo)"
  906.     GOSUB 45010
  907.     SWAP Z$,B$(1)
  908.     Z$ = FN UC$(Z$)
  909.     IF B$(1) <> Z$ THEN _
  910.        A$ = "Passwords Don't match!" : _
  911.        GOSUB 1405 : _
  912.        GOTO 755
  913. 760 Z$ = FN UC$(Z$)
  914.     LSET PASSWORD$ = Z$
  915.     A$ = "Please REMEMBER your password"
  916.     GOSUB 1399
  917.     TEMP.SECURITY.LEVEL = USER.SECURITY.LEVEL
  918.     GOSUB 42950
  919.     BYPASS.TIME.CHECK = TRUE
  920.     GOSUB 43000
  921.     BYPASS.TIME.CHECK = FALSE
  922.     GOSUB 43030
  923.     GOSUB 42800
  924.     GOSUB 42700
  925.     GOSUB 12900
  926.     RIGHT.MARGIN = 64
  927.     EXPERT.USER = FALSE
  928.     GOSUB 9600
  929. '
  930. ' *****************************************************************************
  931. ' *  LOGIN ALL USERS                                                          *
  932. ' *****************************************************************************
  933. '
  934. 800 MAIN.USER.FILE.INDEX = USER.FILE.INDEX
  935.     USER.SECURITY.SAVE = USER.SECURITY.LEVEL
  936.     A$ = "Logging " + ACTIVE.USER.NAME$
  937.     GOSUB 1398
  938.     TIMES.LOGGED.ON = CVI(MID$(USER.OPTIONS$,1,2)) + 1
  939.     GOSUB 9500
  940.     A1$ = LAST.DATE.TIME.ON$
  941.     A$ = "RBBS-PC VERSION " + _
  942.           VERSION.ID$ + _
  943.           " NODE " + _
  944.           NODE.ID$ + _
  945.           RETURN.LINE.FEED$ + _
  946.           " OPERATING AT " + _
  947.           BAUD.PARITY$
  948.     ATTEMPTS = 0
  949.     GOSUB 1399
  950. 815 DOWNLOADS = CVI(USER.DOWNLOADS$)
  951.     UPLOADS = CVI(USER.UPLOADS$)
  952.     LAST.MESSAGE.READ = -LAST.MESSAGE.READ*(LAST.MESSAGE.READ <= HIGH.MESSAGE.NUMBER)
  953.     LSET USER.OPTIONS$ = MKI$(TIMES.LOGGED.ON) + _
  954.                          MID$(USER.OPTIONS$,3)
  955.     LSET LAST.DATE.TIME.ON$ = CURRENT.DATE$ + " " + TIME.LOGGED.ON$
  956.     PUT 2,USER.FILE.INDEX
  957.     GOSUB 27500
  958.     IF NOT LL THEN _
  959.        STOP.INTERRUPTS = WELCOME.INTERRUPTABLE : _
  960.        BYPASS.TIME.CHECK = TRUE : _
  961.        FILE.NAME$ = WELCOME.FILE$ : _
  962.        GOSUB 43030 : _
  963.        GOSUB 6000 : _
  964.        BYPASS.TIME.CHECK = FALSE : _
  965.        STOP.INTERRUPTS = FALSE
  966. 816 IF NEW.USER THEN _
  967.        BYPASS.TIME.CHECK = TRUE : _
  968.        GOSUB 1700 : _
  969.        BYPASS.TIME.CHECK = FALSE _
  970.     ELSE A$ = "Times on:" + STR$(TIMES.LOGGED.ON) : _
  971.          GOSUB 1405 : _
  972.          A$ = "Last time on was: " + A1$ : _
  973.          GOSUB 1405
  974. 817 IF REMIND.FILE.TRANSFERS THEN _
  975.        A$ = "Files Downloaded:" + _
  976.             STR$(DOWNLOADS) + _
  977.             "  Uploaded:" + _
  978.             STR$(UPLOADS) : _
  979.        GOSUB 1400
  980. 820 IF REMIND.PROFILE THEN _
  981.        GOSUB 5400
  982. 825 CI$ = FN SS$(CI$)
  983.     GOTO 830
  984. '
  985. ' *****************************************************************************
  986. ' *  ESC PRESSED ON LOCAL CONSOLE ENTERS HERE                                 *
  987. ' *****************************************************************************
  988. '
  989. 826 USER.LOGON.TIME! = FN TI!
  990.     GOSUB 14500
  991.     LOCAL.USER = TRUE
  992.     WAIT.BEFORE.DISCONNECT = 32400
  993.     IF LOCAL.PASSWORD$ <> "NONE" THEN _
  994.        LOCATE 24,1 : _
  995.        INPUT "Enter PASSWORD";Z$ : _
  996.        IF FN UC$(Z$) <> LOCAL.PASSWORD$ THEN _
  997.           GOTO 13549
  998.     EIGHT.BIT = TRUE
  999.     GR = 1
  1000.     CI$ = "LOCAL"
  1001.     LINE.FEEDS = TRUE
  1002.     RETURN.LINE.FEED$ = LINE.FEED$
  1003.     USER.SECURITY.LEVEL = SYSOP.SECURITY.LEVEL
  1004. 827 FIRST.NAME$ = SYSOP.FIRST.NAME$
  1005.     LAST.NAME$ = SYSOP.LAST.NAME$
  1006.     ACTIVE.USER.NAME$ = "SYSOP"
  1007.     USER.SECURITY.LEVEL = SYSOP.SECURITY.LEVEL
  1008.     SYSOP = TRUE
  1009.     RIGHT.MARGIN = 72
  1010.     GOSUB 41500
  1011.     IF LOCAL.USER THEN _
  1012.        SNOOP = TRUE : _
  1013.        SYSOP.NEXT = TRUE : _
  1014.        GOSUB 33090
  1015. 830 IF USER.SECURITY.LEVEL <> DEFAULT.SECURITY.LEVEL THEN _
  1016.        Z$ = "" : _
  1017.        Z = 0 : _
  1018.        GOSUB 5140 : _
  1019.        IF FOUND THEN _
  1020.           MINUTES.PER.SESSION! = TEMP.TIME.ALLOWED
  1021. 836 IF LOCAL.USER THEN _
  1022.        IF PRINTER THEN _
  1023.           LPRINT  "  Sysop on locally at ";CURRENT.DATE$;", ";TIM$
  1024. 837 IF NOT LOCAL.USER THEN _
  1025.        Z$ = ACTIVE.USER.NAME$ + _
  1026.             " on at " + _
  1027.             CURRENT.DATE$ + _
  1028.             ", " + _
  1029.             TIM$ + _
  1030.             " from " + _
  1031.             CI$ + _
  1032.             ", " + _
  1033.             BAUD.PARITY$ : _
  1034.        NG$ = FN S$(Z$,128) : _
  1035.        Z$ = "  " + Z$ : _
  1036.        GOSUB 13674 : _
  1037.        IF NEW.USER THEN _
  1038.           Z$ = "NEWUSER" : _
  1039.           GOSUB 13665
  1040.     NEW.USER = FALSE
  1041. 842 SECONDS.PER.SESSION! = (MINUTES.PER.SESSION! + LIMIT.DAILY.TIME * ELAPSED.TIME) * 60
  1042.     GOSUB 4910
  1043.     CALLS.TODATE! = CALLS.TODATE! + 1 + SYSOP
  1044.     GOSUB 24000
  1045.     GET 1,NODE.RECORD.INDEX
  1046.     MID$(MESSAGE.RECORD$,1,31) = FN S$(ACTIVE.USER.NAME$,31)
  1047.     MID$(MESSAGE.RECORD$,57,1) = "A"
  1048.     MID$(MESSAGE.RECORD$,60,4) = BAUD.PARITY$
  1049.     PUT 1,NODE.RECORD.INDEX
  1050.     GOSUB 21996
  1051.     IF SYSOP THEN _
  1052.        GOTO 900 _
  1053.     ELSE SYSOP = (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL)
  1054. 850 GOSUB 950
  1055.     IF ACTIVE.BULLETINS < 1 THEN _
  1056.        A$ = "There are no bulletins today" : _
  1057.        GOSUB 1397 : _
  1058.        GOTO 900
  1059. 855 IF BULLETINS.OPTIONAL THEN _
  1060.        A$ = "Would you like to skip the" + STR$(ACTIVE.BULLETINS) + " bulletins" : _
  1061.        GOSUB 1499 : _
  1062.        IF YES THEN _
  1063.           GOTO 900
  1064. 860 GOSUB 9705
  1065. 900 GOSUB 1900
  1066.     GOSUB 950
  1067.     GOTO 955
  1068. '
  1069. ' *****************************************************************************
  1070. ' *  LINE 25 UPDATE ROUTINE                                                   *
  1071. ' *****************************************************************************
  1072. '
  1073. 950 IF NOT SNOOP THEN _
  1074.        RETURN
  1075. 953 CURSOR.LINE = CSRLIN
  1076.     CURSOR.ROW = POS(0)
  1077.     HH = LEN(ACTIVE.USER.NAME$) + LEN(CI$) + LEN(LINE.25$) + 18
  1078.     LOCATE 25,1
  1079.     IF NETWORK.TYPE = 0 THEN _
  1080.        LOCK.STATUS$ = SPACE$(3)+TIME.LOGGED.ON$
  1081. 954 PRINT LINE.25$;SPACE$(79-HH);STR$(USER.SECURITY.LEVEL);" ";ACTIVE.USER.NAME$;" ";CI$;" ";LOCK.STATUS$;
  1082.     LOCATE CURSOR.LINE,CURSOR.ROW
  1083.     RETURN
  1084. 955 GOSUB 4850
  1085.     STOP.INTERRUPTS = TRUE
  1086. '
  1087. ' *****************************************************************************
  1088. ' *                                                                           *
  1089. ' *                           MAIN MENU PROCESSING                            *
  1090. ' *                                                                           *
  1091. ' *****************************************************************************
  1092. '
  1093. 1200 CLOSE 1
  1094.      ACTIVE.MENU$ = "M"
  1095.      GOSUB 49000
  1096.      STOP.INTERRUPTS = TRUE
  1097.      Q = 0
  1098.      GOSUB 1405
  1099.      IF USER.SECURITY.LEVEL < SYSOP.MENU.SECURITY.LEVEL THEN _
  1100.         A1$ = ">" : _
  1101.         GOTO 1240
  1102.      A1$ = ",1,..,7>"
  1103.      IF NOT EXPERT.USER THEN _
  1104.         FILE.NAME$ = MENU$(1) : _
  1105.         GOSUB 43025
  1106. 1240 GOSUB 41050
  1107.      NON.STOP = FALSE
  1108.      IF NOT EXPERT.USER THEN _
  1109.         FILE.NAME$ = MENU$(2) : _
  1110.         GOSUB 43025
  1111. 1250 GOSUB 49000
  1112.      A$ = GRN$ + " Main Functions <B,C,D,E,F,G,H,I,J,K,L,O,P,Q,R,S,U,V,W,X,?" + A1$
  1113.      GOSUB 1499
  1114.      IF Q = 0 THEN _
  1115.         GOTO 1250
  1116. 1270 FOR J = 1 TO Q
  1117.        Z$ = B$(J)
  1118.        Z$ = FN UC$(Z$)
  1119.        FF = VAL(Z$)
  1120.        IF FF = 0 THEN _
  1121.           GOTO 1280
  1122.        IF FF < 1 OR FF > 7 THEN _
  1123.           GOSUB 1350 : _
  1124.           GOTO 1200
  1125. 1274   IF USER.SECURITY.LEVEL < SYSOP.FUNCTION(FF) THEN _
  1126.           VIOLATION$ = "Sysop " + Z$ : _
  1127.           GOSUB 1380 : _
  1128.           GOTO 1200
  1129. 1276   ON FF GOSUB 10070,10090,10390,10530,11000,33070,10930
  1130.        GOTO 1200
  1131. 1280   FF = INSTR("BCDEFGHIJKLOPQRSUVWX?",Z$)
  1132.        IF FF = 0 THEN _
  1133.           GOSUB 1350 : _
  1134.           GOTO 1200
  1135. 1290   IF USER.SECURITY.LEVEL < MAIN.FUNCTION(FF) THEN _
  1136.           VIOLATION$ = "MMenu " + Z$ : _
  1137.           GOSUB 1380 : _
  1138.           GOTO 1200
  1139. 1320   ON FF GOSUB 9700,1800,10970,2000,20015,10560,1740,1760,5300,3900,5200,4700,1900,4320,4330,4340,1330,5800,9800,4240,1700
  1140.      NEXT
  1141.      GOTO 1200
  1142. '
  1143. ' *****************************************************************************
  1144. ' *                                                                           *
  1145. ' *                        UTILITY MENU PROCESSING                            *
  1146. ' *                                                                           *
  1147. ' *****************************************************************************
  1148. '
  1149. 1330 ACTIVE.MENU$ = "U"
  1150.      GOSUB 41050
  1151.      IF NOT EXPERT.USER THEN _
  1152.         FILE.NAME$ = MENU$(4) : _
  1153.         GOSUB 43025
  1154. 1334 GOSUB 49000
  1155.      A$ = GRN$ + " Utility Functions <B,C,F,G,H,L,M,N,P,Q,R,S,T,U,X,!>"
  1156.      GOSUB 1499
  1157.      IF Q = 0 THEN _
  1158.         GOSUB 1350 : _
  1159.         GOTO 1330
  1160. 1336 Z$ = B$(J)
  1161.      Z$ = FN UC$(Z$)
  1162.      FF = INSTR("BCFGHLMNPQRSTUX!",Z$)
  1163.      IF FF = 0 THEN _
  1164.         GOSUB 1360 : _
  1165.         GOTO 1330
  1166.      IF USER.SECURITY.LEVEL < UTILITY.FUNCTION(FF) THEN _
  1167.         VIOLATION$ = "Util " + Z$ : _
  1168.         GOSUB 1380 : _
  1169.         GOTO 1330
  1170. 1338 ON FF GOSUB 5500,42960,42800,43000,1780,4100,10925,42710,5110,1200,5400,4850,9100,10090,4240,4200
  1171.      GOTO 1330
  1172. 1350 IF EXPERT.USER THEN _
  1173.         RETURN
  1174.      GOSUB 1405
  1175. 1360 A$ = B$(J) + " is invalid, " + FIRST.NAME$
  1176.      GOSUB 1405
  1177.      RETURN
  1178. '
  1179. ' *****************************************************************************
  1180. ' *  RECORD SECURITY VIOLATIONS                                               *
  1181. ' *****************************************************************************
  1182. '
  1183. 1380 A$ = "SYSOP must authorize"
  1184.      GOSUB 1397
  1185.      Z$ = "SV!-" + VIOLATION$
  1186.      GOSUB 13670
  1187.      VIOLATIONS.THIS.SESSION = VIOLATIONS.THIS.SESSION + 1
  1188.      IF MAXIMUM.VIOLATIONS = 0 OR VIOLATIONS.THIS.SESSION <= MAXIMUM.VIOLATIONS THEN _
  1189.         RETURN
  1190. 1385 IF USER.FILE.INDEX < 1 THEN _
  1191.         RETURN
  1192.      A$ = "SECURITY VIOLATION!  Sysop can reinstate"
  1193.      IF USER.SECURITY.LEVEL <= MINIMUM.LOGON.SECURITY THEN _
  1194.         A$ = "" : _
  1195.         USER.SECURITY.LEVEL = USER.SECURITY.LEVEL-1 _
  1196.      ELSE USER.SECURITY.LEVEL = MINIMUM.LOGON.SECURITY
  1197. 1386 GOSUB 1405
  1198.      LOGON.ERROR.INDEX = 5
  1199.      GOSUB 21997
  1200.      GET 2,USER.FILE.INDEX
  1201.      LSET SECURITY.LEVEL$ = MKI$(USER.SECURITY.LEVEL)
  1202.      PUT 2,USER.FILE.INDEX
  1203.      GOTO 10620
  1204. 1397 A$ = "Sorry, " + FIRST.NAME$ + ", " + A$
  1205.      GOTO 1405
  1206. '
  1207. ' *****************************************************************************
  1208. ' *  COMMON OUTPUT ROUTINE                                                    *
  1209. ' *****************************************************************************
  1210. '
  1211. 1398 GOSUB 1485
  1212.      GOTO 1405
  1213. 1399 GOSUB 1485
  1214. 1400 CR = 1
  1215. 1403 CR = CR + 1
  1216. 1405 RET = FALSE
  1217.      IF NOT STOP.INTERRUPTS OR CM OR INP(MODEM.STATUS.REGISTER) <128 THEN _
  1218.         GOTO 1435
  1219. 1410 GOSUB 60000
  1220.      Y$ = KEY.PRESSED$
  1221.      IF LOCAL.USER THEN _
  1222.         GOTO 1430
  1223. 1415 IF EOF(3) THEN _
  1224.         GOSUB 42000 : _
  1225.         GOTO 1430
  1226. 1420 Y$ = INPUT$(1,3)
  1227. 1425 IF Y$ = XOFF$ THEN _
  1228.         WHILE EOF(3) : _
  1229.            GOSUB 42000 : _
  1230.         WEND : _
  1231.         GOTO 1420
  1232. 1430 IF Y$ = CHR$(11) AND STOP.INTERRUPTS THEN _
  1233.         GOTO 1475
  1234. 1432 IF Y$ = CANCEL$ AND STOP.INTERRUPTS THEN _
  1235.         GOTO 1475
  1236. 1435 IF NOT SNOOP THEN _
  1237.         GOTO 1437
  1238.      LOCATE ,,1 
  1239.      IF COLOR.SUPPORT AND A$ <> "" THEN _
  1240.         CALL ANSI(A$,C.C,C.L) : _
  1241.         LOCATE C.C,C.L : _
  1242.         GOTO 1437
  1243.      CURSOR.ROW = 1 
  1244.      WHILE CURSOR.ROW <= LEN(A$)
  1245.        CURSOR.LINE = CURSOR.ROW + _
  1246.                      INSTR(MID$(A$,CURSOR.ROW) + _
  1247.                      CARRIAGE.RETURN$,CARRIAGE.RETURN$) - 2
  1248.        PRINT MID$(A$,CURSOR.ROW,CURSOR.LINE-CURSOR.ROW + 1); _
  1249.              MID$(LINE.FEED$,1,-(CURSOR.LINE < LEN(A$)));
  1250.        CURSOR.ROW = CURSOR.LINE + LEN(RETURN.LINE.FEED$) + 2
  1251.      WEND
  1252. 1437 IF LOCAL.USER THEN _
  1253.         GOTO 1450
  1254. 1440 IF UPPER.CASE THEN _
  1255.         A$ = FN UC$(A$)
  1256. 1445 IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  1257.         PRINT #3,A$;
  1258. 1450 IF CR <> 1 THEN _
  1259.         GOSUB 1485 _
  1260.      ELSE IF CR > 1 THEN _
  1261.              GOSUB 1485
  1262. 1470 Y$ = ""
  1263.      A$ = Y$
  1264.      CR = 0
  1265.      RETURN
  1266. 1475 CR = 2
  1267.      A$ = ""
  1268.      RET = STOP.INTERRUPTS
  1269.      STOP.INTERRUPTS = FALSE
  1270.      GOSUB 1410
  1271.      STOP.INTERRUPTS = RET
  1272.      RET = TRUE
  1273.      NON.STOP = FALSE
  1274.      GOTO 1470
  1275. 1485 IF SNOOP THEN _
  1276.         PRINT
  1277. 1490 IF NOT LOCAL.USER AND INP(MODEM.STATUS.REGISTER) > 127 THEN _
  1278.         PRINT #3,RETURN.LINE.FEED$;
  1279. 1495 RETURN
  1280. 1496 RETURN.LINE.FEED$ = MID$(CARRIAGE.RETURN$,1,-(CI$ <> "LOCAL")) + _
  1281.                          NUL$ + _
  1282.                          MID$(LINE.FEED$,1,-LINE.FEEDS)
  1283.      RETURN
  1284. 1499 GOSUB 1485
  1285. '
  1286. ' *****************************************************************************
  1287. ' *  COMMON INPUT ROUTINE                                                     *
  1288. ' *****************************************************************************
  1289. '
  1290. 1500 GOSUB 42000
  1291.      TOA! = FRE("A")
  1292.      AUTO.LOGOFF! = FN TI! + WAIT.BEFORE.DISCONNECT
  1293.      A = 0
  1294.      B = 0
  1295.      C = 0
  1296.      Q = 1
  1297.      EOL = FALSE
  1298.      YES = FALSE
  1299.      B$ = ""
  1300.      NO = FALSE
  1301.      A$ = A$ + "? "
  1302.      GOSUB 1403
  1303.      IF LOCAL.USER THEN _
  1304.         LINE INPUT "",B$ : _
  1305.         GOTO 1575
  1306.      IF PROMPT.BELL AND INP(MODEM.STATUS.REGISTER) >127 THEN _
  1307.         PRINT #3,CHR$(7);
  1308. 1525 WHILE EOF(3)
  1309.        GOSUB 42000
  1310.        IF FN TI! > AUTO.LOGOFF! THEN _
  1311.           GOTO 10590
  1312. 1530   GOSUB 60000
  1313.        Y$ = KEY.PRESSED$
  1314.        IF Y$ <> "" THEN _
  1315.           GOTO 1545
  1316. 1531 WEND
  1317.      GOSUB 42000
  1318. 1540 Y$ = INPUT$(1,3)
  1319.      IF TEST.PARITY THEN _
  1320.         GOTO 1541 _
  1321.      ELSE IF Y$ = CHR$(127) THEN _
  1322.              GOTO 1635 _
  1323.           ELSE GOTO 1545
  1324. 1541 IF ASC(Y$) = 141 THEN _
  1325.         OUT LINE.CONTROL.REGISTER,&H1A : _
  1326.         EIGHT.BIT = FALSE : _
  1327.         TEST.PARITY = FALSE : _
  1328.         GR = FALSE 
  1329. 1542 Y$ = CHR$(ASC(Y$) AND 127)
  1330. 1545 IF Y$ = CHR$(8) OR _
  1331.         Y$ = CHR$(7) OR _
  1332.         Y$ = CHR$(26) OR _
  1333.         Y$ = CHR$(227) THEN _
  1334.         GOTO 1635
  1335. 1550 IF Y$ < " " AND Y$ <> CARRIAGE.RETURN$ THEN _
  1336.         GOTO 1525
  1337. 1553 IF Y$ = "^" THEN _
  1338.         GOTO 1525
  1339. 1555 IF SNOOP THEN _
  1340.         PRINT Y$;
  1341. 1557 IF NOT HIDDEN AND INP(MODEM.STATUS.REGISTER) > 127 THEN _
  1342.         PRINT #3,Y$; _
  1343.      ELSE IF INP(MODEM.STATUS.REGISTER) > 127 THEN_ 
  1344.            PRINT #3,".";
  1345. 1560 IF Y$ = CARRIAGE.RETURN$ THEN _
  1346.         GOTO 1570
  1347. 1563 IF LEN(B$) >= 254 THEN _
  1348.         A$ = "Input too long!" : _
  1349.         GOSUB 1405 : _
  1350.         GOTO 1500
  1351. 1565 B$ = B$ + Y$
  1352.      GOTO 1525
  1353. 1570 IF LINE.FEEDS AND INP(MODEM.STATUS.REGISTER) > 127 THEN _
  1354.         PRINT #3,LINE.FEED$;
  1355. 1575 A = INSTR(B$,";")
  1356.      IF A = 0 THEN _
  1357.         GOTO 1620
  1358. 1580 B$(1) = LEFT$(B$,A-1)
  1359.      A = A + 1
  1360. 1585 B = INSTR(A,B$,";")
  1361.      C = B-A
  1362.      IF C < 1 THEN _
  1363.         EOL = TRUE : _
  1364.         C = 128
  1365. 1595 DF$ = MID$(B$,A,C)
  1366.      IF DF$ <> "" THEN _
  1367.         Q = Q + 1 : _
  1368.         B$(Q) = DF$
  1369. 1605 IF NOT EOL AND Q < 10 THEN _
  1370.         A = B + 1 : _
  1371.         GOTO 1585
  1372. 1610 IF LEN(B$) > 64 THEN _
  1373.         A$ = "Try again, " + FIRST.NAME$ : _
  1374.         GOSUB 1405 : _
  1375.         GOTO 1500
  1376.      GOTO 1625
  1377. 1620 B$(1) = B$
  1378.      Q = 1
  1379.      IF B$ = "" THEN _
  1380.         Q = 0 : _
  1381.         RETURN
  1382. 1625 B$ = FN UC$(B$)
  1383.      IF LEFT$(B$,1) = "Y" THEN _
  1384.         YES = TRUE _
  1385.      ELSE IF LEFT$(B$,1) = "N" THEN _
  1386.              NO = TRUE
  1387. 1628 IF B$(Q) = "NS" OR B$(Q) = "ns" THEN _
  1388.         NO = FALSE : _
  1389.         NON.STOP = TRUE : _
  1390.         B$(Q) = "" : _
  1391.         IF Q > 1 THEN _
  1392.            Q = Q-1
  1393. 1629 IF B$ = "RE" AND USER.SECURITY.LEVEL >= MAIN.FUNCTION(4) THEN _
  1394.         REPLY = TRUE : _
  1395.         RETURN
  1396.      IF B$ = "K" AND USER.SECURITY.LEVEL >= MAIN.FUNCTION(10) THEN _
  1397.         KILL.MESSAGE = TRUE
  1398.      RETURN
  1399. 1635 IF LEN(B$) = 0 THEN _
  1400.         GOTO 1525
  1401. 1640 B$ = LEFT$(B$,LEN(B$)-1)
  1402.      IF SNOOP THEN _
  1403.         PRINT BACK.ARROW$;
  1404. 1650 IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  1405.         PRINT #3,BACKSPACE$;
  1406.      GOTO 1525
  1407. '
  1408. ' *****************************************************************************
  1409. ' *  BAUD RATE CHANGE ROUTINE                                                 *
  1410. ' *****************************************************************************
  1411. '
  1412. 1654 LINE.CONTROL.STATUS = INP(LINE.CONTROL.REGISTER)
  1413.      MSB.SAVE = INP(MSB)
  1414.      OUT MSB,0
  1415.      OUT LINE.CONTROL.REGISTER,LINE.CONTROL.STATUS OR 128
  1416.      IF BAUD.RATE.DIVISOR = &H180 THEN _
  1417.         OUT LSB,&H80 : _
  1418.         OUT MSB,&H1 : _
  1419.         GOTO 1684
  1420. 1662 IF BAUD.RATE.DIVISOR = &H100 THEN _
  1421.         OUT LSB,&H0 : _
  1422.         OUT MSB,&H1 : _
  1423.         GOTO 1684
  1424. 1664 IF BAUD.RATE.DIVISOR = &H60 THEN _
  1425.         OUT LSB,&H60 : _
  1426.         OUT MSB,&H0 : _
  1427.         GOTO 1684
  1428. 1666 IF BAUD.RATE.DIVISOR = &H30 THEN _
  1429.         OUT LSB,&H30 : _
  1430.         OUT MSB,&H0
  1431. 1684 OUT LINE.CONTROL.REGISTER,LINE.CONTROL.STATUS
  1432.      OUT MSB,MSB.SAVE
  1433.      RETURN
  1434. '
  1435. ' *****************************************************************************
  1436. ' *  ? - COMMAND FROM MAIN MENU (FUNCTIONS SUPPORTED)                         *
  1437. ' *****************************************************************************
  1438. '
  1439. 1700 FILE.NAME$ = HELP$(2)
  1440.      GOTO 1765
  1441. '
  1442. ' *****************************************************************************
  1443. ' *  H - COMMAND FROM MAIN MENU (HELP)                                        *
  1444. ' *****************************************************************************
  1445. '
  1446. 1740 FILE.NAME$ = HELP$(1)
  1447.      GOTO 1765
  1448. '
  1449. ' *****************************************************************************
  1450. ' *  I - COMMAND FROM MAIN MENU (DISPLAY INITIAL WELCOME)                     *
  1451. ' *****************************************************************************
  1452. '
  1453. 1760 FILE.NAME$ = WELCOME.FILE$
  1454. 1765 GOSUB 1790
  1455.      RETURN
  1456. '
  1457. ' *****************************************************************************
  1458. ' *  H - COMMAND FROM UTILITIES MENU (HELP)                                   *
  1459. ' *****************************************************************************
  1460. '
  1461. 1780 FILE.NAME$ = HELP$(8)
  1462. 1790 GOSUB 43030
  1463.      GOSUB 6000
  1464.      RETURN
  1465. '
  1466. ' *****************************************************************************
  1467. ' *  C - COMMAND FROM MAIN MENU (LEAVE COMMENT FOR SYSOP)                     *
  1468. ' *****************************************************************************
  1469. '
  1470. 1800 A$ = "Comments require no replies.  " + _
  1471.           "Do you wish to leave a comment for " + _
  1472.           SYSOP.FIRST.NAME$ + _
  1473.           " (Y/N)"
  1474.      GOSUB 1499
  1475.      RIGHT.MARGIN = 72
  1476.      IF NOT YES THEN _
  1477.         GOSUB 1405 : _
  1478.         RETURN
  1479. 1840 MESSAGE.TO$ = "SYSOP"
  1480.      SUBJECT$ = "COMMENT"
  1481.      SYSOP.COMMENT = TRUE
  1482.      GOTO 2007
  1483. 1850 CLOSE 2
  1484.      BX = &H3
  1485.      EN$ = COMMENTS.FILE$
  1486.      GOSUB 29000
  1487.      IF SHARE.IT THEN _
  1488.         OPEN COMMENTS.FILE$ FOR APPEND SHARED AS #2 _
  1489.         ELSE OPEN "A",2,COMMENTS.FILE$
  1490.      A$ = FIRST.NAME$ + ", Thanks for comments!"
  1491.      GOSUB 1399
  1492.      GOSUB 41510
  1493.      PRINT #2,ACTIVE.USER.NAME$,CURRENT.DATE$,TIM$
  1494.      FOR X = 1 TO LINES.IN.MESSAGE
  1495.        PRINT #2,A$(X)
  1496.      NEXT
  1497.      PRINT #2,CARRIAGE.RETURN$
  1498.      CLOSE 2
  1499.      BX = &H3
  1500.      EN$ = COMMENTS.FILE$
  1501.      GOSUB 29500
  1502.      Z$ = "Left comment"
  1503.      GOSUB 13665
  1504.      RETURN
  1505. '
  1506. ' *****************************************************************************
  1507. ' *  P - COMMAND FROM MAIN MENU (DISPLAY PERSONAL MAIL)                       *
  1508. ' *****************************************************************************
  1509. '
  1510. 1900 GOSUB 30500
  1511.      A$ = "Checking messages"
  1512.      GOSUB 1403
  1513.      SHOW.ACTIVE = TRUE
  1514.      MESSAGES.FROM.USER = FALSE
  1515.      ACTIVE.MESSAGES = 0
  1516.      GOSUB 23000
  1517.      MESSAGE.RECORD = FIRST.MESSAGE.RECORD
  1518.      ACTIVE.DELAY! = 0
  1519.      MAXIMUM.MESSAGES = VAL(MID$(MESSAGE.RECORD$,89,7))
  1520.      FOR DF = 1 TO MAXIMUM.MESSAGES
  1521.        M(DF,1) = 0
  1522.        M(DF,2) = 0
  1523.      NEXT
  1524. 1905 GET 1,MESSAGE.RECORD
  1525.      NUMBER.RECORDS.IN.MESSAGE = VAL(MID$(MESSAGE.RECORD$,118))
  1526.      IF NUMBER.RECORDS.IN.MESSAGE < 1 THEN _
  1527.         NUMBER.RECORDS.IN.MESSAGE = 1 
  1528. 1906 IF SHOW.ACTIVE AND FN TI! > ACTIVE.DELAY! THEN _
  1529.         A$ = "." : _
  1530.         GOSUB 1403 : _
  1531.         ACTIVE.DELAY! = FN TI! + 1
  1532. 1910 IF MESSAGE.RECORD >= NEXT.MESSAGE.RECORD THEN _
  1533.         LOW.MESSAGE.NUMBER = M(1,2) : _
  1534.         GOTO 1950
  1535. 1915 IF MID$(MESSAGE.RECORD$,116,1) = DELETED.MESSAGE$ OR _
  1536.         MID$(MESSAGE.RECORD$,116,1) <> ACTIVE.MESSAGE$ THEN _
  1537.         GOTO 1946
  1538. 1920 IF INSTR(MID$(MESSAGE.RECORD$,37,31),ACTIVE.USER.NAME$) OR _
  1539.         (SYSOP AND INSTR(MID$(MESSAGE.RECORD$,37,31),"SYSOP")) OR _
  1540.         (SYSOP AND INSTR(MID$(MESSAGE.RECORD$,37,31),SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$)) THEN _
  1541.         GOTO 1925
  1542.      GOTO 1935
  1543. 1925 IF SHOW.ACTIVE THEN _
  1544.         A$ = "Mail may be for YOU (* = Private)" : _
  1545.         GOSUB 1399 : _
  1546.         SHOW.ACTIVE = FALSE
  1547. 1930 A$ = LEFT$(MESSAGE.RECORD$,5)
  1548.      GOSUB 1403
  1549. 1935 IF INSTR(MID$(MESSAGE.RECORD$,6,31),ACTIVE.USER.NAME$) OR _
  1550.         (SYSOP AND INSTR(MID$(MESSAGE.RECORD$,6,31),"SYSOP")) OR _
  1551.         (SYSOP AND INSTR(MID$(MESSAGE.RECORD$,6,31),SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$)) THEN _
  1552.         GOTO 1940
  1553.      GOTO 1945
  1554. 1940 IF MESSAGES.FROM.USER < 128 THEN _
  1555.         MESSAGES.FROM.USER = MESSAGES.FROM.USER + 1 : _
  1556.         B$(MESSAGES.FROM.USER) = LEFT$(MESSAGE.RECORD$,5)
  1557. 1945 ACTIVE.MESSAGES = ACTIVE.MESSAGES + 1
  1558.      M(ACTIVE.MESSAGES,1) = MESSAGE.RECORD
  1559.      M(ACTIVE.MESSAGES,2) = VAL(MID$(MESSAGE.RECORD$,2,4))
  1560. 1946 MESSAGE.RECORD = MESSAGE.RECORD + NUMBER.RECORDS.IN.MESSAGE
  1561.      GOTO 1905                                              
  1562. 1950 IF MESSAGES.FROM.USER = 0 OR NOT MESSAGE.REMINDER THEN _
  1563.         RETURN
  1564.      A$ = "Mail you may have left"
  1565.      GOSUB 1399
  1566. 1960 FOR I = 1 TO MESSAGES.FROM.USER
  1567.        A$ = B$(I)
  1568.        GOSUB 1403
  1569.      NEXT
  1570.      A$ = "Please <K>ill your old or unneeded messages"
  1571.      GOSUB 1398
  1572.      RETURN
  1573. '
  1574. ' *****************************************************************************
  1575. ' *  E - COMMAND FROM MAIN MENU (ENTER MESSAGE)                               *
  1576. ' *****************************************************************************
  1577. '
  1578. 2000 IF ACTIVE.MESSAGES = MAXIMUM.MESSAGES THEN _
  1579.         A$ = "Too many active messages!  Leave a comment for Sysop! Try tomorrow" : _
  1580.         GOSUB 1398 : _
  1581.         GOTO 3650
  1582. 2006 MESSAGE.PASSWORD$ = ""
  1583.      SYSOP.COMMENT = FALSE
  1584.      IF NOT REPLY THEN _
  1585.         MESSAGE.TO$ = ""
  1586. 2007 IF SYSOP.COMMENT THEN _
  1587.         Z$ = COMMENTS.FILE$ : _
  1588.         FT$ = "comment" _
  1589.      ELSE Z$ = ACTIVE.MESSAGE.FILE$ : _
  1590.           FT$ = "message"
  1591. 2008 IF SYSOP.COMMENT THEN _
  1592.         GOSUB 52000 : _
  1593.         GOTO 2009
  1594.      FREE.SPACE$ = "2000"
  1595.      IF NEXT.MESSAGE.RECORD + 5 >= HIGHEST.MESSAGE.RECORD THEN _
  1596.         FREE.SPACE$ = "1"
  1597. 2009 IF VAL(FREE.SPACE$) < 2000 THEN _
  1598.         A$ = "No room for " + FT$ : _
  1599.         GOSUB 1405 : _
  1600.         GOTO 3650
  1601. 2010 LINES.IN.MESSAGE = 0
  1602.      L = 0
  1603.      X = 0
  1604.      FOR I = 1 TO 30
  1605.        A$(I) = ""
  1606.      NEXT
  1607.      IF SYSOP.COMMENT THEN _
  1608.         GOTO 2100
  1609. 2020 IF REPLY THEN _
  1610.         GOTO 2060
  1611.      A$ = "To (Press [ENTER] for All)"
  1612.      GOSUB 1499
  1613.      IF LEN(B$(1)) > 30 THEN _
  1614.         A$ = "30 Char. Max" : _
  1615.         GOSUB 1405 : _
  1616.         GOTO 2020
  1617. 2030 IF Q = 0 THEN _
  1618.         MESSAGE.TO$ = "ALL" _
  1619.         ELSE MESSAGE.TO$ = FN UC$(B$(1))
  1620. 2035 A$ = "Subject"
  1621.      GOSUB 1500
  1622.      IF LEN(B$(1)) > 25 THEN _
  1623.         A$ = "25 Char. Max" : _
  1624.         GOSUB 1405 : _
  1625.         GOTO 2035
  1626. 2045 IF Q = 0 THEN _
  1627.         GOTO 20095
  1628.      SUBJECT$ = FN UC$(B$(1))
  1629. 2060 A$ = "Security:  K)ill, P)assword, R)eceiver, N)one, H)elp "
  1630.      GOSUB 1500
  1631.      IF Q = 0 THEN _
  1632.         GOTO 2060
  1633.      Z$ = FN UC$ (LEFT$(B$(1),1))
  1634.      ON INSTR("RKNPH",Z$) GOTO 2075,2090,2100,2088,2070
  1635.      GOTO 2060
  1636. '
  1637. ' *****************************************************************************
  1638. ' *  DISPLAY MESSAGE PROTECT HELP                                             *
  1639. ' *****************************************************************************
  1640. '
  1641. 2070 FILE.NAME$ = HELP$(3)
  1642.      GOSUB 1790
  1643.      GOTO 2060
  1644. '
  1645. ' *****************************************************************************
  1646. ' *  MAKE MESSAGE READ PROTECTED (ONLY ADDRESSEE AND SYSOP CAN READ IT)       *
  1647. ' *****************************************************************************
  1648. '
  1649. 2075 IF MESSAGE.TO$ = "ALL" THEN _
  1650.         A$ = "Message to ALL cannot be Receiver protected!" : _
  1651.         GOSUB 1405 : _
  1652.         GOTO 2060
  1653. 2077 IF INSTR(MESSAGE.TO$,"SYSOP") OR _
  1654.         INSTR(MESSAGE.TO$,SYSOP.FIRST.NAME$ + " " + SYSOP.LAST.NAME$) THEN _
  1655.         GOTO 2081
  1656. 2079 IF NOT REPLY THEN _
  1657.         TEMP.USER.NAME$ = MESSAGE.TO$ : _
  1658.         FOUND = FALSE : _
  1659.         SUIX = USER.FILE.INDEX : _
  1660.         GOSUB 12600 : _
  1661.         USER.FILE.INDEX = SUIX : _
  1662.         GOSUB 21995 : _
  1663.         IF NOT FOUND THEN _
  1664.            A$ = MESSAGE.TO$ + " is not an active user." : _
  1665.            GOSUB 1397 : _
  1666.            GOTO 2020
  1667. 2081 A$ = "Sending personal mail to " + MESSAGE.TO$
  1668.      GOSUB 1405
  1669. 2084 MESSAGE.PASSWORD$ = "^READ^"
  1670.      GOTO 2100
  1671. 2085 A$ = "Password":'
  1672.      GOSUB 1500
  1673.      IF Q = 0 THEN _
  1674.         GOTO 2085
  1675.      IF LEN(B$(1)) > L THEN _
  1676.         A$ = STR$(L) + " Chars. max" : _
  1677.         GOSUB 1405 : _
  1678.         GOTO 2085
  1679.      IF L = 15 AND MID$(B$(1),1,1) = "!" THEN _
  1680.         A$ = "Password can't begin with '!'" : _
  1681.         GOSUB 1405 : _
  1682.         GOTO 2085
  1683.      RETURN
  1684. '
  1685. ' *****************************************************************************
  1686. ' *  MAKE MESSAGE PASSWORD PROTECTED (USERS WITH PASSWORD AND SYSOP CAN READ) *
  1687. ' *****************************************************************************
  1688. '
  1689. 2088 A$ = "Receiver(s) Must KNOW PASSWORD TO READ msg.  Use password (Y/N)"
  1690.      GOSUB 1500
  1691.      IF NO THEN _
  1692.         GOTO 2070
  1693.      L = 14
  1694.      A1$ = "!"
  1695.      GOTO 2092
  1696. '
  1697. ' *****************************************************************************
  1698. ' *  MAKE MESSAGE KILL PROTECTED (ONLY SENDER, ADDRESSEE AND SYSOP CAN KILL)  *
  1699. ' *****************************************************************************
  1700. '
  1701. 2090 L = 15
  1702.      A1$ = ""
  1703. 2092 GOSUB 2085
  1704.      MESSAGE.PASSWORD$ = A1$ + FN UC$(B$(1))
  1705. '
  1706. ' *****************************************************************************
  1707. ' *  ENTER MAIN BODY OF MESSAGE                                               *
  1708. ' *****************************************************************************
  1709. '
  1710. 2100 A$ = "Type " + _
  1711.           FT$ + _
  1712.           " Press [ENTER] to end," + _
  1713.           STR$(MAX.MESSAGE.LINES) + _
  1714.           " lines max)"
  1715.      GOSUB 1398
  1716.      GOSUB 3200
  1717. 2125 LINES.IN.MESSAGE = LINES.IN.MESSAGE + 1
  1718.      A$ = RIGHT$(STR$(LINES.IN.MESSAGE),2) + ": " + A$(LINES.IN.MESSAGE)
  1719.      GOSUB 1403
  1720.      GOSUB 3700
  1721.      IF A$(LINES.IN.MESSAGE) = "" THEN _
  1722.         LINES.IN.MESSAGE = LINES.IN.MESSAGE-1 : _
  1723.         GOTO 2300
  1724. 2140 J = LINES.IN.MESSAGE
  1725.      GOSUB 2200
  1726.      IF X THEN _
  1727.         GOTO 2300
  1728.      GOTO 2125
  1729. 2200 X = 0
  1730.      IF J < (MAX.MESSAGE.LINES-2) THEN _
  1731.         RETURN
  1732.      A$ = MID$("2 lines leftLast line   Full",12*(J-(MAX.MESSAGE.LINES-2)) + 1,12)
  1733.      X = (J > (MAX.MESSAGE.LINES-1))
  1734. 2210 GOSUB 1405
  1735.      RETURN
  1736. '
  1737. ' *****************************************************************************
  1738. ' *  FINAL MESSAGE DISPOSITION                                                *
  1739. ' *****************************************************************************
  1740. '
  1741. 2300 GOSUB 1405
  1742.      IF NOT EXPERT.USER THEN _
  1743.         GOSUB 50400
  1744. 2315 A$ = "Editor Sub-function <A,C,D,E,I,L,M,S,?>"
  1745.      GOSUB 1499
  1746.      IF Q = 0 THEN _
  1747.         GOTO 2315
  1748.      Z$ = FN UC$(B$(1))
  1749. 2325 IF Q > 1 AND Z$ <> "M" THEN _
  1750.         L = VAL(B$(Q)) : _
  1751.         GOSUB 3320
  1752. 2330 ON INSTR("ACDEILMS?",Z$) GOTO 2400,2340,2500,2600,2800,3000,3100,3400,2345
  1753.      GOTO 2300
  1754. '
  1755. ' *****************************************************************************
  1756. ' *  CONTINUE ENTERING MESSAGE                                                *
  1757. ' *****************************************************************************
  1758. '
  1759. 2340 GOSUB 3200
  1760.      GOTO 2140
  1761. '
  1762. ' *****************************************************************************
  1763. ' *  DISPLAY MESSAGE SUBCOMMANDS HELP FILE                                    *
  1764. ' *****************************************************************************
  1765. '
  1766. 2345 FILE.NAME$ = HELP$(4)
  1767.      GOSUB 1790
  1768.      GOTO 2315
  1769. '
  1770. ' *****************************************************************************
  1771. ' *  ABORT MESSAGE                                                            *
  1772. ' *****************************************************************************
  1773. '
  1774. 2400 A$ = "Abort " + FT$ + " (Y/N)"
  1775.      GOSUB 1499
  1776.      IF NOT YES THEN _
  1777.         GOTO 2300
  1778. 2430 A$ = "Aborted"
  1779.      GOSUB 1398
  1780.      GOTO 3650
  1781. '
  1782. ' *****************************************************************************
  1783. ' *  DELETE MESSAGE LINE                                                      *
  1784. ' *****************************************************************************
  1785. '
  1786. 2500 GOSUB 1405
  1787.      IF Q = 1 THEN _
  1788.         A$ = "Delete " : _
  1789.         GOSUB 1403 : _
  1790.         GOSUB 3300
  1791. 2520 A$ = "Line #" + STR$(L)
  1792.      GOSUB 1405
  1793.      A$ = A$(L)
  1794.      GOSUB 1400
  1795.      A$ = "Delete this line (Y/N)"
  1796.      GOSUB 1500
  1797.      IF NOT YES THEN _
  1798.         A$ = "NOT Deleted" : _
  1799.         GOSUB 1405 : _
  1800.         GOTO 2300
  1801. 2550 LINES.IN.MESSAGE = LINES.IN.MESSAGE-1
  1802.      FOR X = L TO LINES.IN.MESSAGE
  1803.        A$(X) = A$(X + 1)
  1804.      NEXT
  1805.      A$(LINES.IN.MESSAGE + 1) = ""
  1806.      A$ = "Deleted Line #" + STR$(L)
  1807.      GOSUB 1405
  1808.      GOTO 2300
  1809. '
  1810. ' *****************************************************************************
  1811. ' *  EDIT MESSAGE LINE                                                        *
  1812. ' *****************************************************************************
  1813. '
  1814. 2600 GOSUB 1405
  1815.      IF Q = 1 THEN _
  1816.         GOSUB 3300
  1817. 2620 A$ = "Line #" + STR$(L) + " is:" + RETURN.LINE.FEED$ + A$(L)
  1818.      GOSUB 1400
  1819.      A$ = "Enter <Oldstring;New> or Press [ENTER] to end"
  1820.      GOSUB 1405
  1821.      B$(2) = ""
  1822.      GOSUB 1500
  1823.      IF Q = 0 THEN _
  1824.         GOTO 2300
  1825. 2660 X = INSTR(1,A$(L),B$(1))
  1826.      IF X = 0 THEN _
  1827.         GOTO 2710
  1828. 2670 FF = LEN(B$(1))
  1829.      JJ = LEN(B$(2))
  1830.      IF FF = JJ THEN _
  1831.         MID$(A$(L),X) = B$(2) : _
  1832.         GOTO 2620
  1833. 2690 CC$ = MID$(A$(L),X + FF)
  1834.      DF$ = LEFT$(A$(L),X-1)
  1835.      A$(L) = DF$ + B$(2) + CC$
  1836.      GOTO 2620
  1837. 2710 A$ = "String <" + B$(1) + "> not found in line" + STR$(L)
  1838.      GOSUB 1405
  1839.      GOTO 2300
  1840. '
  1841. ' *****************************************************************************
  1842. ' *  INSERT MESSAGE LINE                                                      *
  1843. ' *****************************************************************************
  1844. '
  1845. 2800 IF LINES.IN.MESSAGE >= MAX.MESSAGE.LINES AND NOT SYSOP THEN _
  1846.         A$ = "Message full" : _
  1847.         GOSUB 1405 : _
  1848.         GOTO 2920
  1849. 2820 GOSUB 1405
  1850.      IF Q = 1 THEN _
  1851.         A$ = "Before " : _
  1852.         GOSUB 1403 : _
  1853.         GOSUB 3300
  1854. 2830 LL = LINES.IN.MESSAGE
  1855.      K = LINES.IN.MESSAGE-L
  1856.      FOR X = L TO LINES.IN.MESSAGE
  1857.        B$(X + 1-L) = A$(X)
  1858.        A$(X) = ""
  1859.      NEXT
  1860.      LINES.IN.MESSAGE = L
  1861. 2840 A$ = RIGHT$(STR$(LINES.IN.MESSAGE),2) + ": "
  1862.      GOSUB 1403
  1863.      GOSUB 3700
  1864.      IF A$(LINES.IN.MESSAGE) = "" THEN _
  1865.         GOTO 2920
  1866. 2870 LINES.IN.MESSAGE = LINES.IN.MESSAGE + 1
  1867.      J = LINES.IN.MESSAGE + K-1
  1868.      GOSUB 2200
  1869.      IF X THEN _
  1870.         GOTO 2920 _
  1871.      ELSE GOTO 2840
  1872. 2920 FOR X = 1 TO K + 1
  1873.        A$(LINES.IN.MESSAGE + X-1) = B$(X)
  1874.      NEXT
  1875.      LINES.IN.MESSAGE = LL + LINES.IN.MESSAGE-L
  1876.      GOTO 2300
  1877. '
  1878. ' *****************************************************************************
  1879. ' *  LIST MESSAGE CONTENTS                                                    *
  1880. ' *****************************************************************************
  1881. '
  1882. 3000 STOP.INTERRUPTS = TRUE
  1883.      GOSUB 1405
  1884.      IF Q = 1 THEN _
  1885.         L = 1 : _
  1886.         A$ = "To: " + MESSAGE.TO$ + " Re: " + SUBJECT$ : _
  1887.         GOSUB 1405 : _
  1888.         GOSUB 3200
  1889. 3020 FOR X = L TO LINES.IN.MESSAGE
  1890.        IF RET THEN _
  1891.           GOTO 2300 _
  1892.        ELSE A$ = RIGHT$(STR$(X),2) + ": " + A$(X)
  1893. 3030   GOSUB 1405
  1894.      NEXT
  1895.      GOTO 2300
  1896. '
  1897. ' *****************************************************************************
  1898. ' *  CHANGE MARGIN WIDTH                                                      *
  1899. ' *****************************************************************************
  1900. '
  1901. 3100 GOSUB 1405
  1902.      IF Q <> 1 THEN _
  1903.         B$(1) = B$(Q) : _
  1904.         GOTO 3130
  1905. 3115 A$ = "SET Right-Margin from" + STR$(RIGHT.MARGIN) + " TO (8...72)"
  1906.      GOSUB 1500
  1907.      IF LEN(B$(1)) > 2 THEN _
  1908.         GOTO 3140
  1909. 3130 X = VAL(B$(1))
  1910.      IF X > 7 AND X < 73 THEN _
  1911.         RIGHT.MARGIN = X : _
  1912.         A$ = "Margin now" + STR$(RIGHT.MARGIN) : _
  1913.         GOTO 3150
  1914. 3140 A$ = "Invalid - Margin UNCHANGED"
  1915. 3150 GOSUB 1405
  1916.      IF UTILITY.MARGIN.CHANGE THEN _
  1917.         RETURN
  1918.      GOTO 2300
  1919. 3200 A$ = "    [" + STRING$(RIGHT.MARGIN-2,45) + "]"
  1920.      GOSUB 1398
  1921.      RETURN
  1922. 3300 A$ = "Line #"
  1923.      GOSUB 1500
  1924.      L = VAL(B$(1))
  1925. 3320 IF L >= 1 AND L <= LINES.IN.MESSAGE THEN _
  1926.         RETURN
  1927. 3330 IF Q = 0 THEN _
  1928.         RETURN 2300
  1929. 3340 A$ = "No such line"
  1930.      GOSUB 1405
  1931.      RETURN 2300
  1932. '
  1933. ' *****************************************************************************
  1934. ' *  SAVE MESSAGE                                                             *
  1935. ' *****************************************************************************
  1936. '
  1937. 3400 IF SYSOP.COMMENT THEN _
  1938.         GOTO 1850
  1939. 3405 GOSUB 4910
  1940.      MESSAGE.RECORD.SAVE$ = MESSAGE.RECORD$
  1941.      A$ = "Adding new msg #" + STR$(HIGH.MESSAGE.NUMBER + 1)
  1942.      GOSUB 1403
  1943.      REC = 0
  1944.      N$ = ""
  1945.      HIGH.MESSAGE.NUMBER = HIGH.MESSAGE.NUMBER + 1
  1946.      ACTIVE.MESSAGES = ACTIVE.MESSAGES + 1
  1947.      MESSAGE.NUMBER$ = STR$(HIGH.MESSAGE.NUMBER) + _
  1948.                        SPACE$(5-LEN(STR$(HIGH.MESSAGE.NUMBER)))
  1949.      IF MESSAGE.PASSWORD$ = "^READ^" THEN _
  1950.         MID$(MESSAGE.NUMBER$,1,1) = "*"
  1951. 3460 MESSAGE.FROM$ = FN S$(ACTIVE.USER.NAME$,31)
  1952.      MESSAGE.TO$ = FN S$(MESSAGE.TO$,31)
  1953.      MID$(MESSAGE.TO$,23,8) = TIME$
  1954.      SUBJECT$ = FN S$(SUBJECT$,25)
  1955.      MESSAGE.PASSWORD$ = FN S$(MESSAGE.PASSWORD$,15)
  1956.      FOR J = 1 TO LINES.IN.MESSAGE
  1957.        A$(J) = A$(J) + CHR$(227)
  1958.        REC = REC + LEN(A$(J))
  1959.      NEXT
  1960.      IF REC MOD 128 = 0 THEN _
  1961.         N$ = STR$(REC\128 + 1) _
  1962.      ELSE N$ = STR$(REC\128 + 2)
  1963. 3530 GET 1,NEXT.MESSAGE.RECORD
  1964.      M(ACTIVE.MESSAGES,1) = NEXT.MESSAGE.RECORD
  1965.      M(ACTIVE.MESSAGES,2) = HIGH.MESSAGE.NUMBER
  1966.      LSET MESSAGE.RECORD$ = MESSAGE.NUMBER$ + _
  1967.                             MESSAGE.FROM$ + _
  1968.                             MESSAGE.TO$ + _
  1969.                             CURRENT.DATE$ + _
  1970.                             SUBJECT$ + _
  1971.                             MESSAGE.PASSWORD$ + _
  1972.                             ACTIVE.MESSAGE$ + _
  1973.                             N$
  1974.      PUT 1,NEXT.MESSAGE.RECORD
  1975.      NEXT.MESSAGE.RECORD = NEXT.MESSAGE.RECORD + VAL(N$)
  1976.      N$ = ""
  1977.      FOR J = 1 TO LINES.IN.MESSAGE
  1978.        A$ = "."
  1979.        GOSUB 1403
  1980.        N$ = N$ + A$(J)
  1981.        IF LEN(N$) > 127 THEN _
  1982.           LSET MESSAGE.RECORD$ = N$ : _
  1983.           PUT 1 : _
  1984.           N$ = MID$(N$,129)
  1985. 3630 NEXT
  1986.      IF LEN(N$) > 0 THEN _
  1987.         LSET MESSAGE.RECORD$ = N$ : _
  1988.         PUT 1
  1989. 3640 GOSUB 1405
  1990.      LSET MESSAGE.RECORD$ = MESSAGE.RECORD.SAVE$
  1991.      GOSUB 24000
  1992.      GOSUB 21996
  1993. 3650 IF REPLY THEN _
  1994.         GOSUB 30500 : _
  1995.         RETURN
  1996.      GOTO 20095
  1997. '
  1998. ' *****************************************************************************
  1999. ' *  ENTER MESSAGE/COMMENT LINES                                              *
  2000. ' *****************************************************************************
  2001. '
  2002. 3700 RS$ = A$(LINES.IN.MESSAGE)
  2003.      COL = LEN(RS$)
  2004.      STOP.INTERRUPTS = FALSE
  2005. 3720 COL = COL + 1
  2006. 3730 IF LOCAL.USER THEN _
  2007.         X$ = INPUT$(1) : _
  2008.         GOTO 3740
  2009. 3732 AUTO.LOGOFF! = FN TI! + WAIT.BEFORE.DISCONNECT
  2010.      WHILE EOF(3)
  2011.        IF FN TI! > AUTO.LOGOFF! THEN _
  2012.           GOTO 10590
  2013. 3733   GOSUB 42000
  2014.        GOSUB 60000
  2015.        X$ = KEY.PRESSED$
  2016.        IF LEN(X$) = 1 THEN _
  2017.           GOTO 3740
  2018. 3736 WEND
  2019. 3737 X$ = INPUT$(1,3)
  2020.      IF X$ = LINE.FEED$ OR _
  2021.         X$ = CHR$(11) OR _
  2022.         X$ = CHR$(12) THEN _
  2023.         GOTO 3730
  2024. 3738 IF X$ = CHR$(127) THEN _
  2025.         GOTO 3870
  2026. 3740 IF X$ = CHR$(8) OR _
  2027.         X$ = CHR$(7) OR _
  2028.         X$ = CHR$(26) OR _
  2029.         X$ = CHR$(227) THEN _
  2030.         GOTO 3870
  2031. 3750 A$ = X$
  2032.      GOSUB 1403
  2033.      IF X$ = CARRIAGE.RETURN$ THEN _
  2034.         GOTO 3850
  2035. 3770 IF COL > RIGHT.MARGIN-3 AND X$ = " " THEN _
  2036.         GOSUB 1405 : _
  2037.         GOTO 3860
  2038. 3780 RS$ = RS$ + X$
  2039.      IF COL < RIGHT.MARGIN + 1 THEN _
  2040.         GOTO 3720
  2041. 3800 Z = LEN(RS$)
  2042.      FOR I = 1 TO LEN(RS$)
  2043.        IF MID$(RS$,Z,1) = " " THEN _
  2044.           GOTO 3820
  2045. 3810   Z = Z-1
  2046.      NEXT
  2047.      Z = LEN(RS$)-1
  2048. 3820 COL = RIGHT.MARGIN + 1 - Z
  2049.      IF SNOOP THEN _
  2050.         LOCATE ,POS(0)-COL: _
  2051.         PRINT STRING$(COL,32);
  2052. 3830 IF NOT LOCAL.USER AND INP(MODEM.STATUS.REGISER) > 127 THEN _
  2053.         PRINT #3,STRING$(COL,8); STRING$(COL,32);
  2054. 3840 A$(LINES.IN.MESSAGE) = LEFT$(RS$,Z)
  2055.      A$(LINES.IN.MESSAGE + 1) = RIGHT$(RS$,COL)
  2056.      GOSUB 1405
  2057.      RETURN
  2058. 3850 IF NOT LOCAL.USER AND LINE.FEEDS AND INP(MODEM.STATUS.REGISTER) > 127 THEN _
  2059.         PRINT #3,LINE.FEED$;
  2060. 3860 A$(LINES.IN.MESSAGE) = RS$
  2061.      RETURN
  2062. 3870 IF COL = 1 THEN _
  2063.         GOTO 3730
  2064.      COL = COL-2
  2065.      RS$ = LEFT$(RS$,LEN(RS$)-1)
  2066. 3880 IF SNOOP THEN _
  2067.         PRINT BACK.ARROW$;
  2068. 3885 IF NOT LOCAL.USER AND INP(MODEM.STATUS.REGISTER) > 127 THEN _
  2069.         PRINT #3,BACKSPACE$;
  2070. 3890 GOTO 3720
  2071. '
  2072. ' *****************************************************************************
  2073. ' *  K - COMMAND FROM MAIN MENU (KILL MESSAGE)                                *
  2074. ' *****************************************************************************
  2075. '
  2076. 3900 KILL.MESSAGE = FALSE
  2077.      GOSUB 1405
  2078.      IF Q <> 1 THEN _
  2079.         MESSAGE.TO.KILL = VAL(B$(Q)) : _
  2080.         GOTO 3950
  2081. 3930 A$ = "Msg # to Kill"
  2082.      GOSUB 1500
  2083.      MESSAGE.TO.KILL = VAL(B$(Q))
  2084.      GOSUB 1405
  2085. 3950 FOR QX = 1 TO ACTIVE.MESSAGES
  2086.        IF M(QX,2) = MESSAGE.TO.KILL AND MESSAGE.TO.KILL >= 1 THEN _
  2087.           GOTO 3970
  2088. 3955 NEXT
  2089.      GOSUB 3965
  2090.      GOTO 4040
  2091. 3965 A$ = "No such msg #" + STR$(MESSAGE.TO.KILL)
  2092.      GOSUB 1405
  2093.      RETURN
  2094. 3970 GOSUB 21990
  2095.      GET 1,M(QX,1)
  2096.      R = VAL(MID$(MESSAGE.RECORD$,118))
  2097.      IF SYSOP THEN _
  2098.         GOTO 4030
  2099. 3980 Z$ = FN SS$(MID$(MESSAGE.RECORD$,101,15))
  2100.      IF LEN(Z$) = 0 THEN _
  2101.         GOTO 4030
  2102. 3990 IF Z$ = "^READ^" THEN _
  2103.         IF INSTR(MESSAGE.RECORD$,ACTIVE.USER.NAME$) THEN _
  2104.            GOTO 4030 _
  2105.         ELSE MESSAGE.PASSWORD = TRUE : _
  2106.              ATTEMPTS.ALLOWED = 0 : _
  2107.              GOSUB 680 : _
  2108.              GOSUB 25000 : _
  2109.              GOTO 4040
  2110. 4000 IF LEFT$(Z$,1) = "!" THEN _
  2111.         Z$ = MID$(Z$,2)
  2112. 4010 PASSWORD.SAVE$ = FN S$(Z$,15)
  2113.      ATTEMPTS.ALLOWED = 1
  2114.      MESSAGE.PASSWORD = TRUE
  2115.      GOSUB 667
  2116.      IF PASSWORD.FAILED THEN _
  2117.         GOSUB 25000 : _
  2118.         GOTO 4040
  2119. 4030 LSET MESSAGE.RECORD$ = LEFT$(MESSAGE.RECORD$,115) + _
  2120.                             DELETED.MESSAGE$ + _
  2121.                             MID$(MESSAGE.RECORD$,117)
  2122.      PUT 1,LOC(1)
  2123.      A$ = "Killed Msg # " + STR$(MESSAGE.TO.KILL)
  2124.      GOSUB 1405
  2125.      GOSUB 25000
  2126. 4040 IF KILL.MESSAGE THEN _
  2127.         RETURN
  2128.      GOTO 20095
  2129. '
  2130. ' *****************************************************************************
  2131. ' *  L - COMMAND FROM UTILITY MENU (LINE FEEDS TOGGLE)                        *
  2132. ' *****************************************************************************
  2133. '
  2134. 4100 LINE.FEEDS = NOT LINE.FEEDS
  2135.      A$ = "Line Feeds " + MID$("OffOn",1-3*LINE.FEEDS,3)
  2136.      GOSUB 1496
  2137.      GOSUB 1405
  2138.      RETURN
  2139. '
  2140. ' *****************************************************************************
  2141. ' *  P - COMMAND FROM UTILITY MENU (PROMPT BELL TOGGLE)                       *
  2142. ' *****************************************************************************
  2143. '
  2144. 4200 PROMPT.BELL = NOT PROMPT.BELL
  2145.      A$ = "Prompting Bell " + MID$("OffOn",1-3*PROMPT.BELL,3)
  2146.      GOSUB 1405
  2147.      RETURN
  2148. '
  2149. ' *****************************************************************************
  2150. ' *  X - COMMAND FROM MAIN MENU (EXPERT TOGGLE)                               *
  2151. ' *  X - COMMAND FROM UTILITY MENU (EXPERT TOGGLE)                            *
  2152. ' *  X - COMMAND FROM FILES MENU (EXPERT TOGGLE)                              *
  2153. ' *****************************************************************************
  2154. '
  2155. 4240 EXPERT.USER = NOT EXPERT.USER
  2156.      A$ = MID$("NoviceExpert",1-6*EXPERT.USER,6)
  2157.      GOSUB 1405
  2158.      RETURN
  2159. '
  2160. ' *****************************************************************************
  2161. ' *  Q - COMMAND FROM MAIN MENU (QUICK SCAN MESSAGES)                         *
  2162. ' *****************************************************************************
  2163. '
  2164. 4320 QUICK.SCAN.MESSAGES = TRUE
  2165.      READ.MESSAGES = FALSE
  2166.      SCAN.MESSAGES = FALSE
  2167.      GOTO 4350
  2168. '
  2169. ' *****************************************************************************
  2170. ' *  R - COMMAND FROM MAIN MENU (READ MESSAGES)                               *
  2171. ' *****************************************************************************
  2172. '
  2173. 4330 QUICK.SCAN.MESSAGES = FALSE
  2174.      READ.MESSAGES = TRUE
  2175.      SCAN.MESSAGES = FALSE
  2176.      GOTO 4350
  2177. '
  2178. ' *****************************************************************************
  2179. ' *  S - COMMAND FROM MAIN MENU (SCAN MESSAGE HEADERS)                        *
  2180. ' *****************************************************************************
  2181. '
  2182. 4340 QUICK.SCAN.MESSAGES = FALSE
  2183.      READ.MESSAGES = FALSE
  2184.      SCAN.MESSAGES = TRUE
  2185. '
  2186. ' *****************************************************************************
  2187. ' *  MESSAGE READ MAINLINE (QUICK SCAN, READ & SCAN ALL USE THIS ROUTINE      *
  2188. ' *****************************************************************************
  2189. '
  2190. 4350 GOSUB 30500
  2191.      QAH = -READ.MESSAGES-QUICK.SCAN.MESSAGES-SCAN.MESSAGES*5
  2192.      IF Q > 2 AND VAL(B$(Q)) = 0 THEN _
  2193.         Z$ = FN UC$(B$(Q)) : _
  2194.         Q = Q-1 _
  2195.      ELSE Z$ = ""
  2196. 4360 LG$(11) = Z$
  2197.      MESSAGES.SELECTED.INDEX = 1
  2198.      NUMBER.MESSAGES.SELECTED = Q
  2199.      ADDRESSED.TO.USER = FALSE
  2200. 4370 MESSAGES.SELECTED.INDEX = MESSAGES.SELECTED.INDEX  + 1
  2201. 4371 IF MESSAGES.SELECTED.INDEX <= NUMBER.MESSAGES.SELECTED THEN _
  2202.         CURRENT.MESSAGE = VAL(B$(MESSAGES.SELECTED.INDEX)) : _
  2203.         GOTO 4415
  2204. 4380 NON.STOP = FALSE
  2205.      ADDRESSED.TO.USER = FALSE
  2206.      A$ = "Msg # (" + _
  2207.            STR$(LOW.MESSAGE.NUMBER) + _
  2208.            " to" + _
  2209.            STR$(M(ACTIVE.MESSAGES,2)) + _
  2210.            ", *, <H>elp)"
  2211.      IF EXPERT.USER THEN _
  2212.         GOTO 4400
  2213. 4390 IF READ.MESSAGES THEN _
  2214.         A$ = A$ + " to Retrieve (Press [ENTER] to end)" _
  2215.      ELSE A$ = "Starting at " + A$
  2216. 4400 GOSUB 1500
  2217.      IF Q = 0 THEN _
  2218.         GOTO 20095
  2219.      IF INSTR("Hh",LEFT$(B$(1),1)) THEN _
  2220.         FILE.NAME$ = HELP$(7) : _
  2221.         GOSUB 1790 : _
  2222.         RETURN
  2223.      MESSAGES.SELECTED.INDEX = 0
  2224.      NUMBER.MESSAGES.SELECTED = Q
  2225.      GOTO 4370
  2226. 4415 FORWARD = FALSE
  2227.      REVERSE = FALSE
  2228.      IF B$(MESSAGES.SELECTED.INDEX) = "*" THEN _
  2229.         CURRENT.MESSAGE = LAST.MESSAGE.READ + 1 : _
  2230.         FORWARD = TRUE : _
  2231.         GOTO 4430
  2232. 4416 IF INSTR("Mm",B$(MESSAGES.SELECTED.INDEX)) THEN _
  2233.         ADDRESSED.TO.USER = TRUE : _
  2234.         GOTO 4370
  2235.      IF CURRENT.MESSAGE = 0 THEN _
  2236.         GOTO 20095
  2237.      GOSUB 1405
  2238. 4430 IF RIGHT$(B$(MESSAGES.SELECTED.INDEX),1) = "+" THEN _         ' CPC131A3
  2239.         FORWARD = TRUE 
  2240.      IF RIGHT$(B$(MESSAGES.SELECTED.INDEX),1) = "-" THEN _
  2241.         REVERSE = TRUE : _
  2242.         GOTO 4490
  2243. 4450 FOR MESSAGE.DIM.INDEX = 1 TO ACTIVE.MESSAGES
  2244.        IF READ.MESSAGES AND _
  2245.           M(MESSAGE.DIM.INDEX,2) = CURRENT.MESSAGE THEN _
  2246.           GOTO 4520
  2247. 4470   IF ((READ.MESSAGES AND FORWARD) OR QUICK.SCAN.MESSAGES OR SCAN.MESSAGES) AND _
  2248.           M(MESSAGE.DIM.INDEX,2)  >= CURRENT.MESSAGE THEN _
  2249.           GOTO 4520
  2250. 4480 NEXT
  2251.      GOTO 4515
  2252. 4490 FOR MESSAGE.DIM.INDEX = ACTIVE.MESSAGES TO 1 STEP -1
  2253.        IF M(MESSAGE.DIM.INDEX,2) <= CURRENT.MESSAGE THEN _
  2254.           GOTO 4540
  2255. 4510 NEXT
  2256. 4515 MESSAGE.TO.KILL = CURRENT.MESSAGE
  2257.      GOSUB 3965
  2258.      GOTO 4370
  2259. 4520 ENDING.MESSAGE.INDEX = MESSAGE.DIM.INDEX
  2260.      IF READ.MESSAGES AND NOT FORWARD THEN _
  2261.         GOTO 4560
  2262. 4530 STARTING.MESSAGE.INDEX = MESSAGE.DIM.INDEX
  2263.      ENDING.MESSAGE.INDEX = ACTIVE.MESSAGES
  2264.      SO = 1
  2265.      GOTO 4550
  2266. 4540 STARTING.MESSAGE.INDEX = MESSAGE.DIM.INDEX
  2267.      ENDING.MESSAGE.INDEX = 1
  2268.      SO = -1
  2269. 4550 FOR MESSAGE.DIM.INDEX = STARTING.MESSAGE.INDEX TO _
  2270.                              ENDING.MESSAGE.INDEX STEP SO
  2271. 4560   GET 1,M(MESSAGE.DIM.INDEX,1)
  2272.        PASSWORD.FAILED = 0
  2273.        UH = 0
  2274.        Z$ = MID$(MESSAGE.RECORD$,101,15)
  2275.        X = 1
  2276. 4561   FF = INSTR(MID$(MESSAGE.RECORD$,X),ACTIVE.USER.NAME$)
  2277.        IF FF THEN _
  2278.           X = LEN(ACTIVE.USER.NAME$) + FF : _
  2279.           IF (FF < 7 OR MID$(MESSAGE.RECORD$,FF-1,1) = " ") AND (X > 66 OR MID$(MESSAGE.RECORD$,X,1) = " ") THEN _
  2280.              UH = TRUE _
  2281.           ELSE IF FF < 37 THEN _
  2282.                   X = 37 : _
  2283.                   GOTO 4561
  2284. 4562   IF NOT SYSOP THEN _
  2285.           IF INSTR(MESSAGE.RECORD$,"^READ^") > 0 AND NOT UH THEN _
  2286.              PASSWORD.FAILED = TRUE : _
  2287.              IF FORWARD OR REVERSE THEN _
  2288.                 GOTO 4635
  2289. 4563   CURRENT.MESSAGE = VAL(MID$(MESSAGE.RECORD$,2,4))
  2290.        IF ADDRESSED.TO.USER AND NOT UH THEN _
  2291.           GOTO 4625
  2292. 4580   IF INSTR(MESSAGE.RECORD$,LG$(11)) = 0 THEN _
  2293.           GOTO 4635
  2294. 4581   IF MID$(MESSAGE.RECORD$,116,1) = DELETED.MESSAGE$ THEN _
  2295.           GOTO 4630
  2296. 4582   PG = FALSE
  2297.        IF MID$(Z$,1,1) = "!" THEN _
  2298.           IF NOT SYSOP THEN _
  2299.              PG = TRUE : _
  2300.              PASSWORD.SAVE$ = MID$(Z$,2) + " " : _
  2301.              ATTEMPTS.ALLOWED = 0 : _
  2302.              GOSUB 665
  2303. 4584   IF PASSWORD.FAILED AND _
  2304.           (QUICK.SCAN.MESSAGES OR (SCAN.MESSAGES AND NOT PG)) THEN _
  2305.           GOTO 4635
  2306. 4585   IF PASSWORD.FAILED THEN _
  2307.           IF PG THEN _
  2308.              SJ$ = "<PASSWORD>" _
  2309.           ELSE SJ$ = "<PROTECTED>" _
  2310.        ELSE SJ$ = MID$(MESSAGE.RECORD$,76,25)
  2311. 4590   IF QUICK.SCAN.MESSAGES THEN _
  2312.           A$ = FN SS$(LEFT$(MESSAGE.RECORD$,5) + " " + SJ$ + "  ") : _
  2313.           GOSUB 1405 : _
  2314.           GOTO 4630
  2315. 4600   GOSUB 8000
  2316.        IF SCAN.MESSAGES OR RET THEN _
  2317.           GOTO 4630
  2318.        IF M(MESSAGE.DIM.INDEX,2) > LAST.MESSAGE.READ THEN _
  2319.           LAST.MESSAGE.READ = M(MESSAGE.DIM.INDEX,2)
  2320. 4610   IF NOT PASSWORD.FAILED THEN _
  2321.           GOTO 4613
  2322.        IF PG THEN _
  2323.           ATTEMPTS.ALLOWED = 2 : _
  2324.           GOSUB 667
  2325. 4611   IF PASSWORD.FAILED THEN _
  2326.           GOTO 4625
  2327. 4613   GOSUB 9000
  2328.        GOSUB 1405
  2329.        IF Q = 0 OR PAGE.LENGTH = 0 THEN _
  2330.           GOTO 4625
  2331. 4614   GOSUB 41000
  2332.        KILL.MESSAGE = FALSE
  2333.        REPLY = FALSE
  2334.        IF NON.STOP THEN _
  2335.           GOTO 4625
  2336. 4616   A$ = "More (Y),N,NS,RE" + MID$(",K",1,-UH*2)
  2337.        GOSUB 1500
  2338.        IF NO THEN _
  2339.           GOTO 4650
  2340. '
  2341. ' *****************************************************************************
  2342. ' *  KILL CURRENT MESSAGE                                                     *
  2343. ' *****************************************************************************
  2344. '
  2345. 4618   IF KILL.MESSAGE AND (UH OR SYSOP) THEN _
  2346.           IF USER.SECURITY.LEVEL >= MAIN.FUNCTION(10) THEN _
  2347.              GOSUB 62520 : _
  2348.              MESSAGE.TO.KILL = CURRENT.MESSAGE : _
  2349.              GOSUB 3950 : _
  2350.              GOSUB 62530 : _
  2351.              GOTO 4625 _
  2352.           ELSE VIOLATION$ = "MMenu R) Func 10" : _
  2353.                GOSUB 1380 : _
  2354.                GOTO 4625
  2355. '
  2356. ' *****************************************************************************
  2357. ' *  REPLY TO CURRENT MESSAGE                                                 *
  2358. ' *****************************************************************************
  2359. '
  2360. 4620   IF NOT REPLY THEN _
  2361.           GOTO 4625
  2362. 4621   IF USER.SECURITY.LEVEL < MAIN.FUNCTION(4) THEN _
  2363.           VIOLATION$ = "MMenu R) Func 4" : _
  2364.           GOSUB 1380 : _
  2365.           REPLY = FALSE : _
  2366.           GOTO 4625
  2367.        IF LEFT$(SUBJECT$,3) <> "(R)" THEN _
  2368.           SUBJECT$ = "(R)" + LEFT$(SUBJECT$,22)
  2369. 4622   MESSAGE.TO$ = MESSAGE.FROM$
  2370.        MESSAGE.FROM$ = ACTIVE.USER.NAME$
  2371.        GOSUB 62520
  2372.        GOSUB 2000
  2373.        REPLY = FALSE
  2374.        GOSUB 62530
  2375.        GOTO 4560
  2376. 4625   IF NOT FORWARD AND NOT REVERSE THEN _
  2377.           GOTO 4370
  2378. 4630   IF PAGE.LENGTH = 0 THEN _
  2379.           GOTO 4631
  2380.        Q = Q + QAH
  2381.        IF Q < PAGE.LENGTH THEN _
  2382.             GOTO 4631
  2383.        GOSUB 5600
  2384.        IF NO THEN _
  2385.           Q = 0 : _
  2386.           GOTO 4650
  2387.        Q = QAH
  2388. 4631   GOSUB 42000
  2389.        IF RET THEN _
  2390.           GOTO 20095
  2391. 4635 NEXT
  2392.      IF READ.MESSAGES THEN _
  2393.         GOTO 4370
  2394. 4650 GOSUB 1405
  2395.      A$ = "End of Msgs"
  2396.      GOSUB 1405
  2397.      GOTO 20095
  2398. '
  2399. ' *****************************************************************************
  2400. ' *  O - COMMAND FROM MAIN MENU (OPERATOR PAGE)                               *
  2401. ' *****************************************************************************
  2402. '
  2403. 4700 IF NOT SYSOP.AVAILABLE GOTO 4708
  2404. 4705 A$ = "Chat. Remote Conversation"
  2405.      GOSUB 1399
  2406.      JJ = FN V(TIME$ ,1)*100 + FN V(TIME$ ,4)
  2407.      IF (JJ > START.OFFICE.HOURS AND JJ < END.OFFICE.HOURS) OR SYSOP.ANNOY THEN _
  2408.         GOTO 4710
  2409. 4707 GOTO 4750
  2410. 4708 A$ = "SYSOP is in from" + _
  2411.           STR$(START.OFFICE.HOURS) + _
  2412.           " to" + _
  2413.           STR$(END.OFFICE.HOURS) + ","
  2414.      GOSUB 1405
  2415.      GOTO 4755
  2416. 4710 A$ = "Page " + SYSOP.FIRST.NAME$ + " (Y/N)"
  2417.      GOSUB 1499
  2418.      IF NO THEN _
  2419.         RETURN
  2420.      PAGE.COUNT = 0
  2421.      A$ = "Paging " + SYSOP.FIRST.NAME$ + " now"
  2422.      GOSUB 1403
  2423.      PAGE.TIME.MAX! = FN TI! + 30
  2424. 4730 GOSUB 50500
  2425. 4735 PAGE.COUNT = PAGE.COUNT + 1
  2426.      IF INKEY$ = ESCAPE$ THEN _
  2427.         GOTO 4765
  2428. 4740 IF PAGE.COUNT MOD 2 THEN _
  2429.         A$ = PAGING.PRINTER.SUPPORT$ + CHR$(7) : _
  2430.         IF LEN(PAGING.PRINTER.SUPPORT$) = 3 THEN _
  2431.            IF PRINTER THEN _
  2432.               LPRINT CHR$(7);
  2433. 4745 GOSUB 1403
  2434.      IF FN TI! < PAGE.TIME.MAX! THEN _
  2435.         GOTO 4730
  2436.      GOSUB 1405
  2437. 4750 A$ = SYSOP.FIRST.NAME$ + " is in from" + _
  2438.           STR$(START.OFFICE.HOURS) + _
  2439.           " to" + _
  2440.           STR$(END.OFFICE.HOURS) + _
  2441.           ", but not now"
  2442.      GOSUB 1397
  2443. 4755 A$ = "If you would like, Please leave a message or a comment"
  2444.      GOSUB 1405
  2445.      Z$ = "Operator paged " + LEFT$(TIME$ ,5)
  2446.      GOSUB 13670
  2447.      RETURN
  2448. 4765 Z$ = "Paged and chatted with Sysop"
  2449.      GOSUB 13665
  2450.      A$ = "SYSOP available! Hi this is " + _
  2451.           SYSOP.FIRST.NAME$ + _
  2452.           " go ahead!"
  2453.      GOSUB 1399
  2454. 4770 CM = TRUE
  2455.      TIME.CHAT.STARTED! = FN TI!
  2456.      GOSUB 49000
  2457. 4775 WHILE EOF(3)
  2458.        LOCATE ,,1
  2459.        GOSUB 60000
  2460.        A$ = KEY.PRESSED$
  2461.        IF A$ = CHR$(8) OR _
  2462.           A$ = CHR$(7) OR _
  2463.           A$ = CHR$(26) OR _
  2464.           A$ = CHR$(127) OR _
  2465.           A$ = CHR$(227) THEN _
  2466.           GOTO 4805  
  2467. 4777 IF A$ = ESCAPE$ THEN _
  2468.         A$ = "" : _
  2469.         CM = 0 : _
  2470.         SECONDS.PER.SESSION! = SECONDS.PER.SESSION! + _
  2471.                                FIX(FN TI! - TIME.CHAT.STARTED!) : _
  2472.         A$ = "Chat mode terminated.  Returning to normal board operations." : _
  2473.         GOSUB 1399 : _
  2474.         GOTO 4820
  2475. 4785   IF A$ = CARRIAGE.RETURN$ THEN _
  2476.           GOTO 4811
  2477. 4790   IF A$ <> "" THEN _
  2478.           GOTO 4800
  2479. 4795 WEND
  2480. 4797 A$ = INPUT$(1,3)
  2481.      IF A$ = CHR$(8) OR _
  2482.         A$ = CHR$(127) THEN _
  2483.         GOTO 4805 _
  2484.      ELSE IF A$ = CARRIAGE.RETURN$ THEN _
  2485.         GOTO 4811
  2486. 4800 WORD.WRAP$ = WORD.WRAP$ + A$
  2487.      IF LEN(WORD.WRAP$) = 78 THEN _
  2488.         GOTO 4813 _
  2489.      ELSE GOSUB 1403 : _
  2490.           GOTO 4775
  2491. 4805 IF POS(0) > 1 THEN _
  2492.         PRINT BACK.ARROW$; : _
  2493.         PRINT #3,BACKSPACE$; : _
  2494.         QQ = LEN(WORD.WRAP$)-1 : _
  2495.         WORD.WRAP$ = LEFT$(WORD.WRAP$,QQ)
  2496. 4810 GOTO 4775
  2497. 4811 IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  2498.         PRINT #3,CARRIAGE.RETURN$;
  2499.      PRINT CARRIAGE.RETURN$;
  2500.      WORD.WRAP$ = ""
  2501.      Q = 0
  2502.      IF LINE.FEEDS AND INP(MODEM.STATUS.REGISTER) > 127 THEN _
  2503.         PRINT #3,LINE.FEED$
  2504.      GOTO 4775
  2505. 4813 IF A$ = " " THEN _
  2506.         WORD.WRAP$ = "" : _
  2507.         Q = 0 : _
  2508.         GOSUB 1400 : _
  2509.         GOTO 4775
  2510.      Z = LEN(WORD.WRAP$)
  2511.      Q = 0
  2512. 4814 IF MID$(WORD.WRAP$,Z,1) = " " THEN _
  2513.         WORD.WRAP$ = MID$(WORD.WRAP$,Z + 1) _
  2514.      ELSE Z = Z - 1 : _
  2515.           Q = Q + 1 : _
  2516.           IF Q >= 70 THEN _
  2517.              GOTO 4811 _
  2518.           ELSE GOTO 4814
  2519. 4815 IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  2520.         PRINT #3,STRING$(Q,8);STRING$(Q,32);CARRIAGE.RETURN$;
  2521.      IF LINE.FEEDS AND INP(MODEM.STATUS.REGISTER) > 127 THEN _
  2522.         PRINT #3,LINE.FEED$
  2523. 4816 LOCATE ,POS(0)-Q
  2524.      PRINT STRING$(Q,32);CARRIAGE.RETURN$;
  2525.      A$ = WORD.WRAP$
  2526.      Q = 0
  2527.      GOSUB 1403
  2528.      GOTO 4775
  2529. 4820 IF ACTIVE.MENU$ = "U" THEN _
  2530.         RETURN 1330
  2531.      IF ACTIVE.MENU$ = "F" THEN _
  2532.         RETURN 20015
  2533.      RETURN 1200
  2534. '
  2535. ' *****************************************************************************
  2536. ' *  S - COMMAND FROM UTILITY MENU (STATISTICS)                               *
  2537. ' *****************************************************************************
  2538. '
  2539. 4850 A$ = "RBBS-PC Version " + VERSION.ID$ + " Node " + NODE.ID$
  2540.      GOSUB 1398
  2541.      IF NOT CONFERENCE.MODE THEN _
  2542.         A$ = "Caller # " + STR$(CALLS.TODATE!) + "  "
  2543. 4855 A$ = A$ + "# active msgs:" + STR$(ACTIVE.MESSAGES) 
  2544.      A$ = A$ + "  Next msg #" + STR$(HIGH.MESSAGE.NUMBER + 1)
  2545.      LAST.MESSAGE.READ = -LAST.MESSAGE.READ * _
  2546.                          (LAST.MESSAGE.READ <= HIGH.MESSAGE.NUMBER)
  2547.      IF LAST.MESSAGE.READ > 0 THEN _
  2548.         A$ = A$ + "  Last msg read:" + STR$(LAST.MESSAGE.READ)
  2549. 4857 GOSUB 1399
  2550.      IF SYSOP THEN _
  2551.         USER.WORK = (HIGHEST.USER.RECORD * .95) + 1: _
  2552.         A$ = "USERS: used" + _
  2553.         STR$(CURRENT.USER.COUNT-1) + _
  2554.         " avl" + _
  2555.         STR$(USER.WORK - CURRENT.USER.COUNT) + _
  2556.         "  MSGS: used" + _
  2557.         STR$(ACTIVE.MESSAGES) + _
  2558.         " avl" + _
  2559.         STR$(MAXIMUM.MESSAGES-ACTIVE.MESSAGES) + _
  2560.         "  MSG REC: used" + _
  2561.         STR$(NEXT.MESSAGE.RECORD-1) + _
  2562.         " avl" + _
  2563.         STR$(HIGHEST.MESSAGE.RECORD + 1 + NODES.IN.SYSTEM - NEXT.MESSAGE.RECORD) : _
  2564.         GOSUB 1399
  2565. 4860 GOSUB 1405
  2566.      RETURN
  2567. 4900 CONFERENCE.MODE = TRUE
  2568.      Z$ = "Entered " + GRN$
  2569.      GOSUB 13665
  2570.      GRN$ = GRN$ + RETURN.LINE.FEED$
  2571.      A$ = "Welcome to " + GRN$
  2572.      GOSUB 1405
  2573. 4905 NAME FILE.NAME$ AS FILE.NAME$
  2574. 4906 GOSUB 43030
  2575.      GOSUB 6000
  2576. 4910 GOSUB 21990
  2577.      IF LOF(1) = 0 THEN _
  2578.         DF$ = ACTIVE.MESSAGE.FILE$ : _
  2579.         CLOSE 1 : _
  2580.         KILL ACTIVE.MESSAGE.FILE$ : _
  2581.         GOSUB 25000 : _
  2582.         GOTO 13600
  2583.      GOSUB 23000
  2584.      RETURN
  2585. '
  2586. ' *****************************************************************************
  2587. ' *  REMOVE NON ALPHA CHARACTERS FROM STRING                                  *
  2588. ' *****************************************************************************
  2589. '
  2590. 5100 X$ = ""
  2591.      FOR Z = 1 TO LEN(Z$)
  2592.        IF ASC(MID$(Z$,Z,1)) < 65 OR ASC(MID$(Z$,Z,1)) > 90 THEN _
  2593.           GOTO 5105
  2594.        X$ = X$ + MID$(Z$,Z,1)
  2595. 5105 NEXT
  2596.      Z$ = X$
  2597.      RETURN
  2598. '
  2599. ' *****************************************************************************
  2600. ' *  P - COMMAND FROM UTILITY MENU (PASSWORD CHANGE)                          *
  2601. ' *****************************************************************************
  2602. '
  2603. 5110 A$ = "Enter new password"
  2604.      GOSUB 45010
  2605.      IF Q = 0 THEN _
  2606.         RETURN
  2607.      IF LEN(B$(1)) > 15 OR B$(1) = SPACE$(LEN(B$(1))) THEN _
  2608.         GOTO 5110
  2609.      Z$ = FN UC$(B$(1))
  2610. 5120 A$ = "Reenter new password"
  2611.      GOSUB 45010
  2612.      IF Q = 0 THEN _
  2613.         RETURN
  2614.      IF Z$ <> FN UC$(B$(1)) THEN _
  2615.         A$ = "Passwords don't match!" : _
  2616.         GOSUB 1405 : _
  2617.         RETURN
  2618. 5125 IF MAXIMUM.PASSWORD.CHANGES AND _
  2619.         CHANGES.THIS.SESSION > _
  2620.         MAXIMUM.PASSWORD.CHANGES AND _
  2621.         NOT SYSOP THEN _
  2622.             A$ = "No changes permitted" : _
  2623.             GOSUB 1398 : _
  2624.             RETURN _
  2625.      ELSE PASSWORD.CHANGE.ALLOWED = TRUE : _
  2626.           GOSUB 5140 : _
  2627.           IF NOT FOUND THEN _
  2628.              GOTO 5129 _
  2629.           ELSE A$ = "Temporary change" : _
  2630.                GOSUB 1398 : _
  2631.                PASSWORD$ = TEMP.PASSWORD$ : _
  2632.                SECONDS.PER.SESSION! = TEMP.TIME.ALLOWED * 60 : _
  2633.                USER.SECURITY.LEVEL = TEMP.SECURITY.LEVEL : _
  2634.                GOSUB 41070 : _
  2635.                SYSOP = (USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL)
  2636.      IF ACTIVE.USER.NAME$ = "SYSOP" THEN _
  2637.         B$(1) = "********"
  2638. 5126 Z$ = "Used temporary password " + B$(1)
  2639.      GOSUB 13670
  2640.      GOSUB 1405
  2641.      RETURN
  2642. 5129 GOSUB 21997
  2643. 5130 GET 2,USER.FILE.INDEX
  2644.      LSET PASSWORD$ = FN UC$(B$(1))
  2645.      PUT 2,USER.FILE.INDEX
  2646.      CLOSE 2
  2647.      GOSUB 27500
  2648.      A$ = "Password changed"
  2649.      STOP.INTERRUPTS = FALSE
  2650.      GOSUB 1398
  2651.      IF MAXIMUM.PASSWORD.CHANGES THEN _
  2652.         CHANGES.THIS.SESSION = CHANGES.THIS.SESSION + 1
  2653. 5131 Z$ = "New Password " + FN UC$(B$(1))
  2654.      GOTO 13670
  2655. '
  2656. ' *****************************************************************************
  2657. ' *  SEARCH "PASSWORDS" FILE FOR TEMPORARY PASSWORDS                          *
  2658. ' *****************************************************************************
  2659. '
  2660. 5140 FOUND = FALSE
  2661.      SWAP PASSWORDS.FILE$,FILE.NAME$
  2662.      GOSUB 58000
  2663.      SWAP PASSWORDS.FILE$,FILE.NAME$
  2664.      IF BADNEWS = 53 THEN _
  2665.          Z$ = "Missing file " + PASSWORDS.FILE$ : _
  2666.          GOSUB 13670 : _
  2667.          IF Z = 1 THEN _
  2668.             Z$ = FN UC$(B$(1)) : _
  2669.             GOTO 5160 _
  2670.          ELSE GOTO 5160
  2671.      Z$ = FN S$(Z$,15)
  2672. 5150 IF EOF(2) THEN _
  2673.         GOTO 5160
  2674. 5151 INPUT #2,TEMP.PASSWORD$,TEMP.SECURITY.LEVEL,TEMP.TIME.ALLOWED
  2675.      IF LEN(TEMP.PASSWORD$) > 15 THEN _
  2676.         GOTO 5150
  2677.      TEMP.PASSWORD$ = FN S$(TEMP.PASSWORD$,15)
  2678.      IF Z$ <> TEMP.PASSWORD$ THEN _
  2679.         GOTO 5150
  2680.      IF PASSWORD.CHANGE.ALLOWED AND _
  2681.         USER.SECURITY.LEVEL >= MINIMUM.SECURITY.FOR.TEMP.PASSWORD THEN _
  2682.         FOUND = TRUE _
  2683.      ELSE IF USER.SECURITY.LEVEL = TEMP.SECURITY.LEVEL THEN _
  2684.              FOUND = TRUE _
  2685.           ELSE 5150
  2686. 5160 RETURN
  2687. '
  2688. ' *****************************************************************************
  2689. ' *  L - COMMAND FROM MAIN MENU (LINES PER PAGE)                              *
  2690. ' *****************************************************************************
  2691. '
  2692. 5200 IF Q > 1 THEN _
  2693.         GOTO 5230
  2694. 5220 A$ = "CHANGE page length from" + STR$(PAGE.LENGTH) + " TO (0 = continuous)"
  2695.      GOSUB 1500
  2696.      IF Q = 0 THEN _
  2697.         GOTO 1200
  2698. 5230 A = VAL(B$(Q))
  2699.      IF A < 0 OR A > 255 THEN _
  2700.         GOTO 5220
  2701.      PAGE.LENGTH = A
  2702.      GOTO 1200
  2703. '
  2704. ' *****************************************************************************
  2705. ' *  J - COMMAND FROM MAIN MENU (JOIN CONFERENCE)                             *
  2706. ' *****************************************************************************
  2707. '
  2708. 5300 NAME CONFERENCE.MENU$ AS CONFERENCE.MENU$
  2709. 5310 IF Q > 1 THEN _
  2710.         B$(1) = B$(2) : _
  2711.         Q = 0 : _
  2712.         IF LEN(B$(2)) > 1 THEN _
  2713.            GOTO 5322 _
  2714.         ELSE GOTO 5317
  2715. 5312 IF EXPERT.USER THEN _
  2716.         GOTO 5315
  2717. 5313 FILE.NAME$ = CONFERENCE.MENU$
  2718.      GOSUB 43025
  2719. 5315 A$ = "Conference Function <J>oin, <L>ist, <M>ain, <Q>uit, <X>pert"
  2720.      GOSUB 1500
  2721.      IF Q = 0 THEN _
  2722.         GOSUB 1405 : _
  2723.         RETURN _
  2724.      ELSE Z$ = B$(1)
  2725. 5317 IF FN UC$(B$(1)) = "X" THEN _
  2726.         GOSUB 4240 : _
  2727.         GOTO 5312
  2728.      FF = INSTR("JLMQ",FN UC$(B$(1)))
  2729.      IF FF = 0 THEN _
  2730.         GOTO 5312
  2731.      ON FF GOTO 5320,5313,5350,2210
  2732. 5320 IF Q > 1 THEN _
  2733.         B$(1) = B$(2) : _
  2734.         GOTO 5322
  2735.      A$ = "Enter conference name"
  2736.      GOSUB 1500
  2737.      IF Q = 0 THEN _
  2738.         GOTO 5312
  2739. 5322 IF SYSOP OR LOCAL.USER THEN _
  2740.         GOSUB 5700
  2741. 5323 GRN$ = FN UC$(B$(1))
  2742.      ACTIVE.MESSAGE.FILE$ = MID$(MAIN.MESSAGE.FILE$,1,2) + GRN$ + "M.DEF"
  2743.      FILE.NAME$ = MID$(WELCOME.FILE$,1,2) + GRN$ + "W.DEF"
  2744. 5324 NAME ACTIVE.MESSAGE.FILE$ AS ACTIVE.MESSAGE.FILE$
  2745. 5325 IF ACTIVE.USER.NAME$ <> "SYSOP" THEN _
  2746.         IF NOT (CONFERENCE.MODE AND (ACTIVE.USER.FILE$ = MAIN.USER.FILE$)) THEN _
  2747.            GOSUB 26000 : _
  2748.            GOSUB 9400 : _
  2749.            GET 2,MAIN.USER.FILE.INDEX : _
  2750.            GOSUB 9600 : _
  2751.            PUT 2,MAIN.USER.FILE.INDEX : _
  2752.            GOSUB 27000
  2753. 5327 ACTIVE.USER.FILE$ = MID$(ACTIVE.USER.FILE$,1,2) + GRN$ + "U.DEF"
  2754.      UPDATE.DATE = TRUE
  2755. 5328 NAME ACTIVE.USER.FILE$ AS ACTIVE.USER.FILE$
  2756. 5330 IF ACTIVE.USER.NAME$ = "SYSOP" THEN _
  2757.         GOTO 5345
  2758.      TEMP.USER.NAME$ = ACTIVE.USER.NAME$
  2759.      GOSUB 12600
  2760.      GOSUB 21995
  2761. 5340 IF FOUND THEN _
  2762.         USER.FILE.INDEX = LOC(2) : _
  2763.         TIX = USER.FILE.INDEX : _
  2764.         GOSUB 9500 : _
  2765.         GOTO 5345
  2766.      A$ = "You are not a member of the " + GRN$ + " conference!"
  2767.      GOSUB 1397
  2768.      GRN$ = ""
  2769.      USER.FILE.INDEX = MAIN.USER.FILE.INDEX
  2770.      ACTIVE.USER.FILE$ = MAIN.USER.FILE$
  2771.      ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$
  2772.      GOSUB 30500
  2773.      GOSUB 23000
  2774.      CONFERENCE.MODE = FALSE
  2775.      GOSUB 1405
  2776.      RETURN
  2777. 5345 GRN$ = GRN$ + " Conference"
  2778.      IF UPDATE.DATE AND ACTIVE.USER.NAME$ <> "SYSOP" THEN _
  2779.         LSET LAST.DATE.TIME.ON$ = CURRENT.DATE$ + _
  2780.                                   " " + _
  2781.                                   TIME.LOGGED.ON$ : _
  2782.         PUT 2,USER.FILE.INDEX : _
  2783.         GOSUB 27500
  2784. 5347 GOSUB 4900
  2785.      GOSUB 25000
  2786.      RETURN 900
  2787. 5350 GRN$ = ""
  2788.      IF ACTIVE.USER.NAME$ = "SYSOP" THEN _
  2789.         GOSUB 5700 : _
  2790.         ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$ : _
  2791.         ACTIVE.USER.FILE$ = MAIN.USER.FILE$ : _
  2792.         CONFERENCE.MODE = FALSE : _
  2793.         GOSUB 1405 : _
  2794.         GOSUB 1900 : _
  2795.         RETURN 1200
  2796.      Z$ = "Exited Conference "
  2797.      GOSUB 13665
  2798. 5360 IF CONFERENCE.MODE AND (ACTIVE.USER.FILE$ <> MAIN.USER.FILE$) THEN _
  2799.         GOSUB 26000 : _
  2800.         GOSUB 9400 : _
  2801.         GET 2,TIX : _
  2802.         GOSUB 9600 : _
  2803.         PUT 2,TIX : _
  2804.         GOSUB 27000
  2805. 5362 IF CONFERENCE.MODE THEN _
  2806.         ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$ : _
  2807.         ACTIVE.USER.FILE$ = MAIN.USER.FILE$ : _
  2808.         CONFERENCE.MODE = FALSE : _
  2809.         GOSUB 9400 : _
  2810.         USER.FILE.INDEX = MAIN.USER.FILE.INDEX : _
  2811.         GET 2,USER.FILE.INDEX : _
  2812.         GOSUB 9500 : _
  2813.         GOSUB 1900
  2814.      GOSUB 1405
  2815.      RETURN
  2816. '
  2817. ' *****************************************************************************
  2818. ' *  R - COMMAND FROM UTILITY MENU (REVIEW PROFILE)                           *
  2819. ' *****************************************************************************
  2820. '
  2821. 5400 A$ = "Your PROFILE (utilities reset)"
  2822.      GOSUB 1399
  2823.      EXPERT.USER = NOT EXPERT.USER
  2824.      GOSUB 4240
  2825.      GOSUB 43020
  2826.      FF = INSTR("AMXC",USER.TRANSFER.DEFAULT$)
  2827.      FF = FF-5*(FF < 1)
  2828.      GOSUB 42810
  2829.      UPPER.CASE = NOT UPPER.CASE
  2830.      GOSUB 42960
  2831.      LINE.FEEDS = NOT LINE.FEEDS
  2832.      GOSUB 4100
  2833.      GOSUB 42720
  2834.      PROMPT.BELL = NOT PROMPT.BELL
  2835.      GOTO 4200
  2836. '
  2837. ' *****************************************************************************
  2838. ' *  B - COMMAND FROM UTILITY MENU (300 TO 450 BAUD CHANGE)                   *
  2839. ' *****************************************************************************
  2840. '
  2841. 5500 IF BPS <> -1 THEN _
  2842.         A$ = "only 300 baud can change speed" : _
  2843.         GOSUB 1397 : _
  2844.         RETURN
  2845. 5507 A$ = "Change to 450 baud"
  2846.      GOSUB 1500
  2847.      IF NOT YES THEN _
  2848.         RETURN
  2849. 5510 A$ = "Change. Then press [ENTER] until I respond"
  2850.      GOSUB 1405
  2851.      FOR I = 1 TO 3
  2852.        GOSUB 50510
  2853.      NEXT
  2854.      C = 0
  2855.      BAUD.RATE.DIVISOR = &H100
  2856.      GOSUB 1654
  2857. 5530 C = C + 1
  2858.      GOSUB 42000
  2859.      IF C = 20 THEN _
  2860.         Z$ = "Baud change failed" : _
  2861.         GOSUB 13665 : _
  2862.         GOTO 10595
  2863.      GOSUB 50500
  2864. 5535 IF EOF(3) THEN _
  2865.         GOTO 5530
  2866. 5536 IF ASC(INPUT$(1,3)) = 13 THEN _
  2867.         GOTO 5540
  2868. 5537 GOTO 5530
  2869. 5540 Z$ = "Changed to 450 baud"
  2870.      GOSUB 13670
  2871.      A$ = Z$
  2872.      GOSUB 1405
  2873.      BPS = -2
  2874.      RETURN
  2875. '
  2876. ' *****************************************************************************
  2877. ' *  PROVIDE (Y),N,NS MESSAGES FOR TEXT FILES LONGER THAN PAGE LENGTH         *
  2878. ' *****************************************************************************
  2879. '
  2880. 5600 GOSUB 41000
  2881.      AUTO.LOGOFF! = FN TI! + WAIT.BEFORE.DISCONNECT
  2882.      IF NON.STOP THEN _
  2883.         RETURN _
  2884.      ELSE A$ = "More (Y),N,NS" : _
  2885.           GOSUB 1500 : _
  2886.           RETURN
  2887. '
  2888. ' *****************************************************************************
  2889. ' *  SAVE SYSOP LAST MESSAGE READ POINTER                                     *
  2890. ' *****************************************************************************
  2891. '
  2892. 5700 GOSUB 21990
  2893.      GET 1,1
  2894.      MID$(MESSAGE.RECORD$,123,4)=MID$(STR$(LAST.MESSAGE.READ),2)
  2895.      PUT 1,1
  2896.      GOSUB 21996
  2897.      RETURN
  2898. '
  2899. ' *****************************************************************************
  2900. ' *  V - COMMAND FROM MAIN MENU (VIEW CONFERENCES)                            *
  2901. ' *****************************************************************************
  2902. '
  2903. 5800 A$ = "The V)iew Conferences command has not been implemented!"
  2904.      GOSUB 1399
  2905.      RETURN
  2906. '
  2907. ' *****************************************************************************
  2908. ' *  DISPLAY TEXT FILES & SCAN DIRECTORIES                                    *
  2909. ' *****************************************************************************
  2910. '
  2911. 6000 IF STOP.INTERRUPTS THEN _
  2912.         A$ = "* <Ctrl K> or <Ctrl X> aborts <Ctrl S> suspends *" : _
  2913.         GOSUB 1399
  2914. 6020 CK = 0
  2915.      GOTO 7100
  2916. 6030 Q = -1
  2917.      CK = 0
  2918.      GOTO 7110
  2919. 6080 A$ = "Missing file " + FILE.NAME$ + ". Please tell SYSOP"
  2920.      GOSUB 1405
  2921.      RETURN
  2922. '
  2923. ' *****************************************************************************
  2924. ' *  SCAN DIRECTORIES (PRINT TEXT)                                            *
  2925. ' *****************************************************************************
  2926. '
  2927. 7000 A$ = "Scanning Directory " + _
  2928.           MID$(FILE.NAME$,3,INSTR(FILE.NAME$,".")-3) + _
  2929.           " for " + _
  2930.           A1$
  2931.      GOSUB 1405
  2932.      PG = TRUE
  2933. 7100 GOSUB 58000
  2934.      IF BADNEWS = 53 THEN _
  2935.          Z$ = "Missing File " + FILE.NAME$ : _
  2936.          GOSUB 13670 : _
  2937.          GOTO 6080
  2938.      Q = 0
  2939.      FF = PAGE.LENGTH-1
  2940. 7110 IF EOF(2) OR (INP(MODEM.STATUS.REGISTER) < 128 AND NOT LOCAL.USER) THEN _
  2941.         GOTO 7260
  2942. 7120 IF PAGE.LENGTH AND Q >= 0 THEN _
  2943.         IF Q >= FF THEN _
  2944.            GOSUB 5600 : _
  2945.            IF NO THEN _
  2946.               GOTO 7260 _
  2947.            ELSE Q = 0
  2948. 7130 LINE INPUT #2,A$
  2949.      IF CK = 0 THEN _
  2950.         GOTO 7250
  2951. 7157 IF CK > 1 THEN _
  2952.         Z$ = FN UC$(A$) : _
  2953.         XXX = (INSTR(Z$,RS$) = 0) : _
  2954.         GOTO 7190
  2955. 7160 A = INSTR(9,MID$(A$,1,32),"/")
  2956.      IF A = 0 THEN _
  2957.         A = INSTR(9,MID$(A$,1,32),"-")
  2958. 7162 IF A < 3 THEN _
  2959.         GOTO 7110
  2960.      IF INSTR("0123456789",MID$(A$,A-1,1)) = 0 THEN _
  2961.         GOTO 7110
  2962.      A = A-2
  2963.      KEE$ = FN DC$(MID$(A$,A,8))
  2964.      IF MID$(KEE$,3,1) = " " THEN _
  2965.         MID$(KEE$,3,1) = "0"
  2966. 7185 IF MID$(KEE$,5,1) = " " THEN _
  2967.         MID$(KEE$,5,1) = "0"
  2968. 7189 XXX = (KEE$ < RS$)
  2969. 7190 IF XXX THEN _
  2970.         GOTO 7110
  2971.      IF PG THEN _
  2972.         PG = FALSE : _
  2973.         GOSUB 58000 : _
  2974.         Q = 0 : _
  2975.         GOTO 7110
  2976. 7200 IF PG THEN _
  2977.         GOTO 7110
  2978. 7250 GOSUB 1405
  2979.      Q = Q-(Q >= 0)
  2980.      IF NOT RET THEN _
  2981.         GOTO 7110
  2982. 7260 A$ = ""
  2983.      Q = 0
  2984.      CLOSE 2
  2985.      GOSUB 42000
  2986.      RETURN
  2987. '
  2988. ' *****************************************************************************
  2989. ' *  FORMAT MESSAGE HEADER INFORMATION FOR DISPLAY                            *
  2990. ' *****************************************************************************
  2991. '
  2992. 8000 GOSUB 1405
  2993.      IF RET THEN _
  2994.         RETURN
  2995. 8020 IF MID$(MESSAGE.RECORD$,37,5) = "ALL  " THEN _
  2996.         MESSAGE.TO$ = "ALL" : _
  2997.         GOTO 8040
  2998. 8030 MESSAGE.TO$ = FN SS$(MID$(MESSAGE.RECORD$,37,22))
  2999. 8040 SUBJECT$ = FN SS$(MID$(MESSAGE.RECORD$,76,25))
  3000.      IF PASSWORD.FAILED THEN _
  3001.         SUBJECT$ = SJ$
  3002. 8050 MESSAGE.FROM$ = FN SS$(MID$(MESSAGE.RECORD$,6,31))
  3003.      A$ = "Msg # " + _
  3004.           LEFT$(MESSAGE.RECORD$,5) + _
  3005.           " Dated " + _
  3006.           MID$(MESSAGE.RECORD$,68,8) + _
  3007.           " " + _
  3008.           MID$(MESSAGE.RECORD$,59,8)
  3009.      IF NOT RET THEN _
  3010.         A$ = A$ + _
  3011.              RETURN.LINE.FEED$ + _
  3012.              " From: " + _
  3013.              MESSAGE.FROM$ + _
  3014.              RETURN.LINE.FEED$ + _
  3015.              "   To: " + _
  3016.              MESSAGE.TO$ + _
  3017.              RETURN.LINE.FEED$ + _
  3018.              "   Re: " + _
  3019.              SUBJECT$
  3020. 8080 GOSUB 1405
  3021.      RETURN
  3022. '
  3023. ' *****************************************************************************
  3024. ' * UNCOMPRESS MESSAGE PRIOR TO DISPLAY                                       *
  3025. ' *****************************************************************************
  3026. '
  3027. 9000 GOSUB 1405
  3028.      Q = 4
  3029.      FOR X = 2 TO VAL(MID$(MESSAGE.RECORD$,118))
  3030.        GOSUB 1403
  3031.        EOL = FALSE
  3032.        J = 1
  3033.        GET 1
  3034. 9050   B = INSTR(J,MESSAGE.RECORD$,CHR$(227))
  3035.        IF RET THEN _
  3036.           RETURN
  3037. 9060   C = B-J
  3038.        IF C < 0 THEN _
  3039.           C = 128 : _
  3040.           EOL = TRUE
  3041. 9070   A$ = MID$(MESSAGE.RECORD$,J,C)
  3042.        IF EOL THEN _
  3043.           GOTO 9090
  3044. 9085   J = B + 1
  3045.        GOSUB 57100
  3046.        GOTO 9050
  3047. 9090 NEXT
  3048.      A$ = ""
  3049.      RETURN
  3050. '
  3051. ' *****************************************************************************
  3052. ' *  T - COMMAND FROM UTILITY MENU (TIME ON SYSTEM)                           *
  3053. ' *****************************************************************************
  3054. '
  3055. 9100 GOSUB 1405
  3056.      GOSUB 9140
  3057.      GOSUB 41510
  3058.      A$ = "Now " + TIM$ + "  Time on: "
  3059.      IF HHH > 0 THEN _
  3060.         A$ = A$ + STR$(HHH) + " Hrs"
  3061. 9110 A$ = A$ + STR$(MMM) + " Min &" + STR$(SSS) + " Sec"
  3062.      GOSUB 1405
  3063.      RETURN
  3064. 9140 H = FN V(TIME.LOGGED.ON$,1)
  3065.      M = FN V(TIME.LOGGED.ON$,4)
  3066.      S = FN V(TIME.LOGGED.ON$,7)
  3067.      HH = FN V(TIME$ ,1)
  3068.      MM = FN V(TIME$ ,4)
  3069.      JJ = FN V(TIME$ ,7)
  3070.      IF S <= JJ THEN _
  3071.         SSS = JJ-S _
  3072.      ELSE SSS = 60-(S-JJ) : _
  3073.           M = M + 1
  3074. 9150 IF M <= MM THEN _
  3075.         MMM = MM-M _
  3076.      ELSE MMM = 60-(M-MM) : _
  3077.           H = H + 1
  3078. 9160 IF H <= HH THEN _
  3079.         HHH = HH-H : _
  3080.         RETURN _
  3081.      ELSE HHH = 24-(H-HH) : _
  3082.           RETURN
  3083. '
  3084. ' *****************************************************************************
  3085. ' * OPEN AND DEFINE USER FILE RECORD VARIABLES                                *
  3086. ' *****************************************************************************
  3087. '
  3088. 9400 CLOSE 2
  3089.      IF SHARE.IT THEN _
  3090.         OPEN ACTIVE.USER.FILE$ FOR RANDOM SHARED AS #2 LEN=128 _
  3091.         ELSE OPEN "R",2,ACTIVE.USER.FILE$,128
  3092.      FIELD 2,31 AS USER.NAME$, _
  3093.              15 AS PASSWORD$, _
  3094.               2 AS SECURITY.LEVEL$, _
  3095.              14 AS USER.OPTIONS$,  _
  3096.              24 AS CITY.STATE$, _
  3097.              19 AS MACHINE.TYPE$, _
  3098.              14 AS LAST.DATE.TIME.ON$, _
  3099.               3 AS LIST.NEW.DATE$, _
  3100.               2 AS USER.DOWNLOADS$, _
  3101.               2 AS USER.UPLOADS$, _
  3102.               2 AS ELAPSED.TIME$
  3103.      FIELD 2,128 AS USER.RECORD$
  3104.      RETURN
  3105. '
  3106. ' *****************************************************************************
  3107. ' * GET USER DEFAULTS                                                         *
  3108. ' *****************************************************************************
  3109. '
  3110. 9500 USER.SECURITY.LEVEL = CVI(SECURITY.LEVEL$)
  3111.      LAST.MESSAGE.READ = CVI(MID$(USER.OPTIONS$,3,2))
  3112.      USER.TRANSFER.DEFAULT$ = MID$(USER.OPTIONS$,5,1)
  3113.      GR = VAL(MID$(USER.OPTIONS$,6,1))
  3114.      USER.GRAPHIC.DEFAULT$ = MID$(" GC",GR + 1,-(GR > 0))
  3115.      RIGHT.MARGIN = CVI(MID$(USER.OPTIONS$,7,2))
  3116. 9510 USER.OPTIONS = CVI(MID$(USER.OPTIONS$,9,2))
  3117.      PROMPT.BELL = FN BT(USER.OPTIONS,1)
  3118.      EXPERT.USER = FN BT(USER.OPTIONS,2)
  3119.      NULLS = FN BT(USER.OPTIONS,4)
  3120.      UPPER.CASE = FN BT(USER.OPTIONS,8)
  3121.      LINE.FEEDS = FN BT(USER.OPTIONS,16)
  3122.      PAGE.LENGTH = ASC(MID$(USER.OPTIONS$,13))
  3123. 9520 NUL$ = MID$(STRING$(5,0),1,-5*NULLS)
  3124.      GOSUB 1496
  3125.      RETURN
  3126. '
  3127. ' *****************************************************************************
  3128. ' * UPDATE USER DEFAULTS                                                      *
  3129. ' *****************************************************************************
  3130. '
  3131. 9600 LSET USER.OPTIONS$ = MKI$(TIMES.LOGGED.ON) + _
  3132.                           MKI$(LAST.MESSAGE.READ) + _
  3133.                           USER.TRANSFER.DEFAULT$ + _
  3134.                           MID$(STR$(GR),2,1) + _
  3135.                           MKI$(RIGHT.MARGIN) + _
  3136.                           MKI$(-PROMPT.BELL-2*EXPERT.USER-4*NULLS-8*UPPER.CASE-16*LINE.FEEDS) + _
  3137.                           MKI$(0) + _
  3138.                           CHR$(PAGE.LENGTH) + _
  3139.                           STRING$(1,0)
  3140.      RETURN
  3141. '
  3142. ' *****************************************************************************
  3143. ' *  B - COMMAND FROM MAIN MENU (READ BULLETINS)                              *
  3144. ' *****************************************************************************
  3145. '
  3146. 9700 IF ACTIVE.BULLETINS < 1 THEN _
  3147.         A$ = "no bulletins today" : _
  3148.         GOSUB 1397 : _
  3149.         RETURN
  3150. 9705 FILE.NAME$ = BULLETIN.MENU$
  3151.      GOSUB 1790
  3152. 9707 GOSUB 41000
  3153.      NON.STOP = FALSE
  3154.      A$ = "Bulletin # 1 thru" + STR$(ACTIVE.BULLETINS) + ", L)ist, Press [ENTER] to Quit"
  3155.      GOSUB 1499
  3156.      IF Q = 0 THEN _
  3157.         GOSUB 1405 : _
  3158.         RETURN
  3159. 9708 IF FN UC$(B$(1)) = "L" THEN _
  3160.         GOTO 9705
  3161. 9711 Z$ = FN UC$(B$(1))
  3162.      IF VAL(Z$) > 0 AND VAL(Z$) <= ACTIVE.BULLETINS THEN _
  3163.         GOTO 9720
  3164.      GOTO 9705
  3165. 9720 B$(1) = FN RS$(B$(1))
  3166.      Z$ = "Read Bulletin # " + B$(1)
  3167.      GOSUB 13665
  3168.      FILE.NAME$ = BULLETIN.PREFIX$ + FN UC$(B$(1))
  3169.      STOP.INTERRUPTS = TRUE
  3170.      GOSUB 1790
  3171.      STOP.INTERRUPTS = FALSE
  3172.      GOSUB 41050
  3173.      GOTO 9707
  3174. '
  3175. ' *****************************************************************************
  3176. ' *  W - COMMAND FROM MAIN MENU (WHO'S ON THE OTHER NODES)                    *
  3177. ' *****************************************************************************
  3178. '
  3179. 9800 IF CONFERENCE.MODE THEN _
  3180.         A$ = "Nodes won't display within a conference!" : _
  3181.         GOSUB 1400 : _
  3182.         RETURN
  3183.      GOSUB 1405
  3184.      GOSUB 30500
  3185.      FOR NODE.INDEX = 2 TO NODES.IN.SYSTEM + 1
  3186.         GET 1,NODE.INDEX
  3187.         A$ = MID$(MESSAGE.RECORD$,1,31) + _
  3188.         "Node" + _
  3189.         STR$(NODE.INDEX - 1) + _
  3190.         LEFT$(" in",1-2*(MID$(MESSAGE.RECORD$,57,1) <> "A")) + _
  3191.         "active " + _
  3192.         MID$(MESSAGE.RECORD$,60,4) + _
  3193.         " Baud"
  3194.         GOSUB 1405
  3195.      NEXT
  3196.      RETURN
  3197. '
  3198. ' *****************************************************************************
  3199. ' *  1 - COMMAND FROM SYSOP MENU (DISPLAY COMMENTS)                           *
  3200. ' *****************************************************************************
  3201. '
  3202. 10070 FILE.NAME$ = COMMENTS.FILE$
  3203.       GOSUB 6000
  3204.       RETURN
  3205. '
  3206. ' *****************************************************************************
  3207. ' *  U - COMMAND FROM UTILITY MENU (DISPLAY USERS)                            *
  3208. ' *  2 - COMMAND FROM SYSOP MENU (DISPLAY USERS)                              *
  3209. ' *****************************************************************************
  3210. '
  3211. 10090 A$ = "List - <U>sers, <R>ecent callers, Press [ENTER] to quit"
  3212.       GOSUB 1499
  3213.       IF Q = 0 THEN _
  3214.          RETURN
  3215.       ON INSTR("UR",FN UC$(B$(1))) + 1 GOTO 10090,10096,10100
  3216. 10096 GOSUB 12700
  3217.       GOSUB 9400
  3218.       STOP.INTERRUPTS = TRUE
  3219.       Q = 0
  3220.       FOR I = 1 TO HIGHEST.USER.RECORD-1
  3221.         GET 2,I
  3222.         IF ASC(USER.NAME$) = 0 OR LEFT$(USER.NAME$,3) = "   " THEN _
  3223.            GOTO 10099
  3224.         A$ = LEFT$(USER.NAME$,20) + _
  3225.              CITY.STATE$ + _
  3226.              MACHINE.TYPE$ + _
  3227.              LAST.DATE.TIME.ON$
  3228.         GOSUB 1405
  3229.         IF RET THEN _
  3230.            RETURN
  3231.         GOSUB 57110
  3232. 10099 NEXT
  3233.       STOP.INTERRUPTS = FALSE
  3234.       RETURN
  3235. 10100 GOTO 57000
  3236. '
  3237. ' *****************************************************************************
  3238. ' *  3 - COMMAND FROM SYSOP MENU (RECOVER MESSAGE)                            *
  3239. ' *****************************************************************************
  3240. '
  3241. 10390 A$ = "Recover Msg #"
  3242.       GOSUB 1500
  3243.       MESSAGE.TO.RECOVER = VAL(B$(1))
  3244.       IF MESSAGE.TO.RECOVER < 1 THEN _
  3245.          GOTO 1450
  3246. 10410 MESSAGE.RECORD = FIRST.MESSAGE.RECORD
  3247.       GOSUB 1405
  3248.       GOSUB 30500
  3249. 10420 GET 1,MESSAGE.RECORD
  3250.       NUMBER.RECORDS.IN.MESSAGE = VAL(MID$(MESSAGE.RECORD$,118))
  3251.       IF MESSAGE.RECORD >= NEXT.MESSAGE.RECORD THEN _ 
  3252.          A$ = "No Msg #" + STR$(MESSAGE.TO.RECOVER) : _
  3253.          GOSUB 1405 : _
  3254.          RETURN
  3255. 10440 IF VAL(MID$(MESSAGE.RECORD$,2,4)) <> MESSAGE.TO.RECOVER THEN _
  3256.          MESSAGE.RECORD = MESSAGE.RECORD + NUMBER.RECORDS.IN.MESSAGE : _
  3257.          GOTO 10420
  3258. 10450 IF INSTR(MESSAGE.RECORD$,DELETED.MESSAGE$) <> 0 THEN _
  3259.          GOSUB 22000 : _
  3260.          LSET MESSAGE.RECORD$ = LEFT$(MESSAGE.RECORD$,115) + _
  3261.                                 ACTIVE.MESSAGE$ + _
  3262.                                 MID$(MESSAGE.RECORD$,117) : _
  3263.          PUT 1,LOC(1) : _
  3264.          GOSUB 25000 : _
  3265.          A$ = "Restored Msg #" + STR$(MESSAGE.TO.RECOVER) : _
  3266.          GOSUB 1405 : _
  3267.          GOTO 10490
  3268. 10480 A$ = "Msg #" + STR$(MESSAGE.TO.RECOVER) + " not Dead"
  3269.       GOSUB 1405
  3270.       RETURN
  3271. 10490 A$ = "Re-Loading Msg File"
  3272.       GOSUB 1405
  3273.       GOSUB 1900
  3274.       RETURN
  3275. '
  3276. ' *****************************************************************************
  3277. ' *  4 - COMMAND FROM SYSOP MENU (DELETE COMMENTS)                            *
  3278. ' *****************************************************************************
  3279. '
  3280. 10530 A$ = "Delete comments (Y/N)"
  3281.       GOSUB 1500
  3282.       IF YES THEN _
  3283.          CLOSE 2 : _
  3284.          IF SHARE.IT THEN _
  3285.             OPEN COMMENTS.FILE$ FOR OUTPUT SHARED AS #2 _
  3286.          ELSE OPEN "O",2,COMMENTS.FILE$
  3287.       CLOSE 2
  3288. 10550 GOTO 20095
  3289. 10553 Z$ = "time limit exceeded!"
  3290.       GOSUB 13665
  3291.       IF LIMIT.DAILY.TIME THEN _
  3292.          A$ = "Daily time limit exceeded!  Please try tomorrow" _
  3293.       ELSE A$ = "Session time limit exceeded."
  3294.       GOSUB 1397
  3295. 10555 IF KG THEN _
  3296.          RETURN
  3297. '
  3298. ' *****************************************************************************
  3299. ' *  G - COMMAND FROM MAIN MENU (GOODBYE)                                     *
  3300. ' *  G - COMMAND FROM FILES MENU (GOODBYE)                                    *
  3301. ' *****************************************************************************
  3302. '
  3303. 10560 GOSUB 9100
  3304.       A$ = FIRST.NAME$ + ", Thanks for calling and please call again!"
  3305.       GOSUB 1405
  3306.       Z$ = "Logged off"
  3307.       GOSUB 13665
  3308.       GOTO 10595
  3309. 10590 Z$ = "Sleep Disconnect "
  3310.       GOSUB 13665
  3311. 10595 GOSUB 9140
  3312.       GOSUB 13700
  3313.       IF SYSOP OR LOCAL.USER THEN _
  3314.          GOSUB 5700
  3315.       IF USER.FILE.INDEX < 1 THEN _
  3316.          CLS : _
  3317.          GOTO 13540
  3318.       IF CONFERENCE.MODE AND (ACTIVE.USER.FILE$ <> MAIN.USER.FILE$) THEN _
  3319.          GOSUB 21997 : _
  3320.          GET 2,TIX : _
  3321.          GOSUB 9600 : _
  3322.          PUT 2,TIX : _
  3323.          GOSUB 27500
  3324. 10598 IF CONFERENCE.MODE THEN _
  3325.          ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$ : _
  3326.          ACTIVE.USER.FILE$ = MAIN.USER.FILE$ : _
  3327.          USER.FILE.INDEX = MAIN.USER.FILE.INDEX : _
  3328.          GOSUB 9400 : _
  3329.          GET 2,USER.FILE.INDEX : _
  3330.          GOSUB 9500
  3331. 10600 SYSOP = FALSE
  3332.       GOSUB 21997
  3333. 10601 GET 2,USER.FILE.INDEX
  3334.       GOSUB 9600
  3335.       IF LIST.DIRECTORY THEN _
  3336.          LSET LIST.NEW.DATE$ = FN CD$(CURRENT.DATE$)
  3337. 10605 LSET USER.DOWNLOADS$ = MKI$(DOWNLOADS)
  3338.       LSET USER.UPLOADS$ = MKI$(UPLOADS)
  3339.       GOSUB 41010
  3340.       LSET ELAPSED.TIME$ = MKI$(ELAPSED.TIME + _
  3341.                          (SECONDS.PER.SESSION! / 60) - _
  3342.                           TIME.REMAINING!)
  3343.       PUT 2,USER.FILE.INDEX
  3344.       GOTO 13540
  3345. 10620 Z$ = LG$(LOGON.ERROR.INDEX)
  3346.       GOSUB 13670
  3347.       Z$ = ACTIVE.USER.NAME$ + _
  3348.            " on at " + _
  3349.            CURRENT.DATE$ + _
  3350.            ", " + _
  3351.            TIM$ + _
  3352.            "** LOGON DENIED **, " + _
  3353.            BAUD.PARITY$
  3354.       NG$ = FN S$(Z$,128)
  3355.       GOSUB 13674
  3356. 10698 A$ = "Access denied!"
  3357.       GOSUB 1399
  3358.       GOTO 13540
  3359. '
  3360. ' *****************************************************************************
  3361. ' *  SCAN FILE DIRECTORIES FOR DIRECTORY FILENAMES                            *
  3362. ' *****************************************************************************
  3363. '
  3364. 10720 CLS
  3365. 10721 FILES B$(J)
  3366.       X = CSRLIN
  3367.       LOCATE 2,1,1
  3368.       MAIN.DIRECTORY$ = FN S$(DIRECTORY.EXTENTION$,8)
  3369.       FOR I = 2 TO X
  3370.         FOR B = 1 TO 66 STEP 18
  3371.           G = G + 1
  3372.           B$(G) = ""
  3373.           FOR QQ = 0 TO 7
  3374.             H = SCREEN (I,(B + QQ))
  3375.             B$(G) = B$(G) + CHR$(H)
  3376.           NEXT
  3377. 10733     IF LIST.NEW THEN _
  3378.              IF (OMIT.MAIN.DIRECTORY$ = "YES" AND B$(G) = MAIN.DIRECTORY$) OR _
  3379.                 (OMIT.UPLOAD.DIRECTORY$ = "YES" AND B$(G) = UPLOAD.DIR.CHECK$) THEN _
  3380.                     G = G-1 : _
  3381.                     GOTO 10840
  3382. 10740     IF LEFT$(B$(G),1) = " " THEN _
  3383.              G = G-1 : _
  3384.              RETURN
  3385. 10840   NEXT
  3386.       NEXT
  3387.       RETURN
  3388. '
  3389. ' *****************************************************************************
  3390. ' *  M - COMMAND FROM UTILITY MENU (CHANGE MARGINS)                           *
  3391. ' *****************************************************************************
  3392. '
  3393. 10925 UTILITY.MARGIN.CHANGE = TRUE
  3394.       GOSUB 3100
  3395.       UTILITY.MARGIN.CHANGE = FALSE
  3396.       RETURN
  3397. '
  3398. ' *****************************************************************************
  3399. ' *  7 - COMMAND FROM SYSOP MENU (EXIT TO DOS)                                *
  3400. ' *****************************************************************************
  3401. '
  3402. 10930 IF DOS.VERSION < 2 OR REQUIRED.RINGS = 0 THEN _
  3403.          A$ = "Remote exit to DOS not available." : _
  3404.          GOTO 1200
  3405. 10932 IF LOCAL.USER THEN _
  3406.          A$ = "Only for remote SYSOP's" : _
  3407.          GOTO 1200
  3408. 10934 CLOSE 2
  3409.       OPEN "O",2,RCTTY.BAT$
  3410.       PRINT #2,"ECHO OFF"
  3411.       PRINT #2,"CTTY ";COM.PORT$
  3412.       PRINT #2,"ECHO RBBS-PC ";VERSION.ID$
  3413.       PRINT #2,"ECHO SYSOP in Remote Console Mode at "; TIME$ ;" on "; DATE$
  3414.       PRINT #2,DISK.FOR.DOS$;"COMMAND "
  3415.       PRINT #2,"CTTY CON"
  3416.       PRINT #2,RBBS.BAT$
  3417. 10950 GOSUB 41500
  3418.       Z$ = "Exited to DOS at " + TIM$
  3419.       GOSUB 13670
  3420.       GOTO 10992
  3421. '
  3422. ' *****************************************************************************
  3423. ' *  D - COMMAND FROM MAIN MENU (EXIT TO DOORS)                               *
  3424. ' *****************************************************************************
  3425. '
  3426. 10970 IF NOT DOORS.AVAILABLE OR REQUIRED.RINGS = 0 THEN _
  3427.          A$ = "All doors are locked!" : _
  3428.          GOSUB 1405 : _
  3429.          GOTO 20095
  3430. 10973 FILE.NAME$ = MENU$(5)
  3431.       GOSUB 43025
  3432.       IF USER.SECURITY.LEVEL < DOORS.SECURITY.LEVEL THEN _
  3433.          A$ = "You do not have a key for my doors!" : _
  3434.          GOSUB 1405 : _
  3435.          RETURN
  3436. 10974 A$ = "Open which door (Press [ENTER] to quit)"
  3437.       GOSUB 1500
  3438.       IF Q = 0 THEN _
  3439.          RETURN
  3440.       Z$ = FN UC$(B$(1))
  3441. 10976 GOSUB 58000
  3442. 10978 IF EOF(2) THEN _
  3443.          A$ = "No such door " + Z$ : _
  3444.          GOSUB 1405 : _
  3445.          GOTO 1200
  3446.       GOSUB 42000
  3447. 10982 LINE INPUT #2,A$
  3448.       IF LEN(A$) < LEN(Z$) THEN _
  3449.          GOTO 10978
  3450.       IF INSTR(A$,Z$) = 0 THEN _
  3451.          GOTO 10978
  3452.       Z$ = Z$ + ".BAT"
  3453. 10986 NAME Z$ AS Z$
  3454. 10987 CLOSE 2
  3455.       OPEN "O",2,RCTTY.BAT$
  3456.       PRINT #2,Z$
  3457.       PRINT #2,RBBS.BAT$
  3458.       CLOSE 2
  3459.       A$ = Z$ + " door opened at " + TIME$ + " on " + DATE$
  3460.       GOSUB 1405
  3461.       EXIT.TO.DOORS = TRUE
  3462.       Z$ = LEFT$(Z$,LEN(Z$)-4) + " door opened!"
  3463.       GOSUB 13670
  3464. 10992 CLOSE 3
  3465.       OUT MODEM.CONTROL.REGISTER,INP(MODEM.CONTROL.REGISTER) OR 1
  3466.       IF EXIT.TO.DOORS THEN _
  3467.          IF MULTI.LINK.PRESENT THEN _
  3468.             DEF SEG = MULTI.LINK.PRESENT : _
  3469.             GOSUB 60500 : _
  3470.             POKE (&H64 + PEEK(&H58) + 256*PEEK(&H59) + &HC),ASC(RIGHT$(COM.PORT$,1))-48 : _
  3471.             AX = &H700 + DOORS.TERMINAL.TYPE : _
  3472.             GOSUB 60510 : _
  3473.             AX = &HB01 : _
  3474.             BX = 0 : _
  3475.             GOSUB 60510
  3476. 10996 GOSUB 9140
  3477.       GOSUB 43050
  3478.       RUN "EXITRBBS.EXE"
  3479. '
  3480. ' *****************************************************************************
  3481. ' *  5 - COMMAND FROM SYSOP MENU (USER FILE MAINTENANCE)                      *
  3482. ' *****************************************************************************
  3483. '
  3484. 11000 TU = USER.FILE.INDEX
  3485.       STOP.INTERRUPTS = TRUE
  3486.       I = 1
  3487.       SCAN.USERS = FALSE
  3488.       A$ = "A)dd, L)st, P)rt, M)od, S)can users (Press [ENTER] to quit)"
  3489.       GOSUB 1500
  3490. 11003 IF Q = 0 THEN _
  3491.          GOTO 20093
  3492.       QQ = 0
  3493.       Z$ = FN UC$(LEFT$(B$(1),1))
  3494.       IF Z$ = "A" THEN _
  3495.          GOTO 12300 _
  3496.       ELSE IF Z$ = "M" THEN _
  3497.               STOP.INTERRUPTS = FALSE _
  3498.            ELSE IF Z$ = "P" THEN _
  3499.                    QQ = TRUE _
  3500.                 ELSE IF Z$ = "S" THEN _
  3501.                         SCAN.USERS = TRUE : _
  3502.                         STOP.INTERRUPTS = FALSE _
  3503.                      ELSE IF Z$ <> "L" THEN _
  3504.                              GOTO 11000
  3505. 11005 GOSUB 9400
  3506.       Z = 1
  3507.       IF SCAN.USERS THEN _
  3508.          A$ = "Scan for N)ame, P)wd, C)ity/St, S)ystem or L)evel" : _
  3509.          GOSUB 1500 : _
  3510.          SCAN.FUNCTION$ = FN UC$(LEFT$(B$(1),1)) : _
  3511.          CR = 0 : _
  3512.          GOSUB 1405 : _
  3513.          GOSUB 12966 : _
  3514.       GOTO 12962
  3515. 11010 FOR J = Z TO HIGHEST.USER.RECORD-1
  3516.         GET 2,J
  3517. 11015   IF ASC(USER.NAME$) = 0 OR LEFT$(USER.NAME$,3) = "   " THEN _
  3518.            GOTO 11300
  3519.         OF = CVI(SECURITY.LEVEL$)
  3520.         A$ = RIGHT$("     "+STR$(LOC(2)),4) + _
  3521.              ":" + _
  3522.              USER.NAME$ + _
  3523.              "SECURITY" + _
  3524.              RIGHT$("     "+STR$(OF),5) + _
  3525.              " "
  3526. 11020   A$ = A$ + _
  3527.              "Password = " + _
  3528.              PASSWORD$
  3529. 11025   IF QQ THEN _
  3530.            LPRINT A$
  3531. 11027   GOSUB 1405
  3532.         RH = RET
  3533.         IF OF < MINIMUM.LOGON.SECURITY THEN _
  3534.            A$ = "     <Locked out>  " : _
  3535.            GOTO 11030
  3536.         IF OF >= SYSOP.SECURITY.LEVEL THEN _
  3537.            A$ = "     (SYSOP)       " : _
  3538.            GOTO 11030
  3539.         A$ = SPACE$(19)
  3540. 11030   A$ = A$ + _
  3541.              LAST.DATE.TIME.ON$ + _
  3542.              "   " + _
  3543.              CITY.STATE$ + _
  3544.              MACHINE.TYPE$
  3545. 11100   IF QQ THEN _
  3546.            LPRINT A$
  3547. 11101   GOSUB 1405
  3548.         RH = RET
  3549.         A$ = "  DOWNLOADS = " + _
  3550.              RIGHT$("     "+STR$(CVI(USER.DOWNLOADS$)),5)
  3551.         A$ = FN S$(A$,22) + _
  3552.              "UPLOADS = " + _
  3553.              RIGHT$("     "+STR$(CVI(USER.UPLOADS$)),5)
  3554.         A$ = FN S$(A$,40) + _
  3555.              " Times on =" +  _
  3556.              RIGHT$("     "+STR$(CVI(MID$(USER.OPTIONS$,1,2))),5)
  3557.         A$ = FN S$(A$,59) + _
  3558.              "TIME USED = " + _
  3559.              RIGHT$("     "+STR$(CVI(ELAPSED.TIME$)),5) + _
  3560.              " Min"
  3561.         IF QQ THEN _
  3562.            LPRINT A$
  3563. 11105   GOSUB 1405
  3564.         IF STOP.INTERRUPTS THEN _
  3565.            GOTO 11300
  3566. 11110   A$ = "D)elete, F)ind, M)enu, N)ew pwd, P)rint, Q)uit, S)ecurity, #)user"
  3567.         GOSUB 1500
  3568.         IF NOT SCAN.USERS AND Q = 0 THEN _
  3569.            GOTO 11310
  3570. 11115   Z$ = FN UC$(LEFT$(B$(1),1))
  3571.         X = INSTR("DNPQFSM",Z$)
  3572.         IF Z$ = "" AND SCAN.USERS THEN _
  3573.            GOTO 12965
  3574.         ON X GOTO 11130,11160,11220,11320,11340,11390,11330
  3575. 11125   Z = VAL(B$)
  3576.         IF Z < 1 OR Z > HIGHEST.USER.RECORD-1 THEN _
  3577.            GOTO 11310 _
  3578.         ELSE GOTO 11010
  3579. '
  3580. ' *****************************************************************************
  3581. ' *  D - COMMAND FROM 5- USER MAINTENANCE OPTIONS (DELETE USER)               *
  3582. ' *****************************************************************************
  3583. '
  3584. 11130   LSET USER.NAME$ = "deleted user"
  3585.         LSET SECURITY.LEVEL$ = MKI$(MINIMUM.LOGON.SECURITY -1)
  3586.         LSET LAST.DATE.TIME.ON$ = "01/01/80" + " " + TIME.LOGGED.ON$
  3587.         GOTO 11290
  3588. '
  3589. ' *****************************************************************************
  3590. ' *  N - COMMAND FROM 5- USER MAINTENANCE OPTIONS (CHANGE USER PASSWORD)      *
  3591. ' *****************************************************************************
  3592. '
  3593. 11160   GOSUB 12800
  3594.         GOTO 11290
  3595. '
  3596. ' *****************************************************************************
  3597. ' *  P - COMMAND FROM 5- USER MAINTENANCE OPTIONS (PRINT USER FILE)           *
  3598. ' *****************************************************************************
  3599. '
  3600. 11220   QQ = NOT QQ
  3601.         GOTO 11015
  3602. 11290   USER.FILE.INDEX = LOC(2)
  3603.         GOSUB 26500
  3604.         PUT 2,USER.FILE.INDEX
  3605.         GOSUB 27500
  3606.         USER.FILE.INDEX = 0
  3607.         GOTO 11015
  3608. 11300   IF RH THEN _
  3609.            GOTO 11330
  3610. 11310   IF SCAN.USERS THEN _
  3611.            GOTO 12965
  3612. 11311 NEXT
  3613. '
  3614. ' *****************************************************************************
  3615. ' *  Q - COMMAND FROM 5- USER MAINTENANCE OPTIONS (QUIT TO MAIN MENU)         *
  3616. ' *****************************************************************************
  3617. '
  3618. 11320 CLOSE 2
  3619.       USER.FILE.INDEX = TU
  3620.       GOTO 20095
  3621. '
  3622. ' *****************************************************************************
  3623. ' *  M - COMMAND FROM 5- USER MAINTENANCE OPTIONS (MAIN USER MAINT. MENU)     *
  3624. ' *****************************************************************************
  3625. '
  3626. 11330 CLOSE 2
  3627.       GOTO 11000
  3628. '
  3629. ' *****************************************************************************
  3630. ' *  F - COMMAND FROM 5- USER MAINTENANCE OPTIONS (FIND USER)                 *
  3631. ' *****************************************************************************
  3632. '
  3633. 11340 A$ = "Full name to find"
  3634.       GOSUB 1499
  3635.       IF Q = 0 THEN _
  3636.          GOTO 11340
  3637.       TEMP.USER.NAME$ = FN UC$(B$(1))
  3638.       IF LEN(TEMP.USER.NAME$) < 6 THEN _
  3639.          GOTO 11340
  3640.       GOSUB 12600
  3641.       GOSUB 21995
  3642.       USER.FILE.INDEX = 0 
  3643.      IF FOUND THEN _
  3644.          GOTO 11015
  3645. 11380 A$ = TEMP.USER.NAME$ + " not found"
  3646.       GOSUB 1400
  3647.       GOTO 11310
  3648. '
  3649. ' *****************************************************************************
  3650. ' *  S - COMMAND FROM 5- USER MAINTENANCE OPTIONS (CHANGE USER SECURITY)      *
  3651. ' *****************************************************************************
  3652. '
  3653. 11390 GOSUB 11395
  3654.       LSET SECURITY.LEVEL$ = MKI$(OF)
  3655.       GOTO 11290
  3656. 11395 A$ = "Enter security level"
  3657.       GOSUB 1500
  3658.       Z$ = FN UC$(B$(1))
  3659.       OF = VAL(Z$)
  3660.       IF OF > USER.SECURITY.LEVEL THEN _
  3661.          OF = USER.SECURITY.LEVEL
  3662.       RETURN
  3663. '
  3664. ' *****************************************************************************
  3665. ' *  A - COMMAND FROM 5- USER MAINTENANCE OPTIONS (ADD USER)                  *
  3666. ' *****************************************************************************
  3667. '
  3668. 12300 A1$ = ""
  3669.       ATTEMPTS = 0
  3670.       USER.SECURITY.LEVEL.SAVE = USER.SECURITY.LEVEL
  3671.       FIRST.NAME.SAVE$ = FIRST.NAME$
  3672.       LAST.NAME.SAVE$ = LAST.NAME$
  3673.       ACTIVE.USER.NAME.SAVE$ = ACTIVE.USER.NAME$
  3674.       CITY.STATE.SAVE$ = CI$
  3675.       GOSUB 12500
  3676.       TEMP.USER.NAME$ = ACTIVE.USER.NAME$
  3677.       GOSUB 30500
  3678.       GOSUB 12600
  3679.       GOSUB 25000
  3680.       IF USER.FILE.INDEX = 0 THEN _
  3681.          GOTO 12320
  3682.       IF FOUND THEN _
  3683.          PRINT "User already exists" : _
  3684.          GOSUB 27000 : _
  3685.          GOTO 12320
  3686. 12310 GOSUB 12630
  3687.       GOSUB 12800
  3688.       GOSUB 11395
  3689.       TEMP.SECURITY.LEVEL = OF
  3690.       GOSUB 12900
  3691.       LSET LAST.DATE.TIME.ON$ = CURRENT.DATE$ + _
  3692.                                 " " + _
  3693.                                 TIME.LOGGED.ON$
  3694.       GOSUB 12950
  3695.       LSET CITY.STATE$ = FN UC$(B$(1))
  3696.       LSET ELAPSED.TIME$ = MKI$(0)
  3697.       PUT 2,USER.FILE.INDEX
  3698. 12320 GOSUB 27500
  3699.       USER.SECURITY.LEVEL = USER.SECURITY.LEVEL.SAVE
  3700.       FIRST.NAME$ = FIRST.NAME.SAVE$
  3701.       LAST.NAME$ = LAST.NAME.SAVE$
  3702.       ACTIVE.USER.NAME$ = ACTIVE.USER.NAME.SAVE$
  3703.       CI$ = CITY.STATE.SAVE$
  3704.       USER.FILE.INDEX = TU
  3705.       GOTO 11000
  3706. '
  3707. ' *****************************************************************************
  3708. ' *  GET USER FIRST AND LAST NAMES                                            *
  3709. ' *****************************************************************************
  3710. '
  3711. 12500 IF ATTEMPTS > 5 THEN _
  3712.          FF = TRUE : _
  3713.          RETURN
  3714. 12510 GOSUB 12700
  3715.       ATTEMPTS = ATTEMPTS + 1
  3716.       A$ = A1$ + "FIRST Name"
  3717.       GOSUB 1499
  3718.       IF Q = 0 THEN _
  3719.          GOTO 12500
  3720.       Z$ = FN UC$(B$(1))
  3721.       GOSUB 5100
  3722.       FIRST.NAME$ = FN SS$(Z$)
  3723.       IF Q = 1 THEN _
  3724.          GOTO 12530
  3725. 12520 Z$ = FN UC$(B$(2))
  3726.       GOTO 12540
  3727. 12530 A$ = A1$ + "LAST Name"
  3728.       GOSUB 1500
  3729.       Z$ = FN UC$(B$(1))
  3730. 12540 GOSUB 5100
  3731.       LAST.NAME$ = FN SS$(Z$)
  3732.       IF LEN(FIRST.NAME$) < 2 OR _
  3733.          LEN(LAST.NAME$) < 2 OR _
  3734.          (LEN(FIRST.NAME$) + LEN(LAST.NAME$)) > 30 THEN _
  3735.          GOTO 12500
  3736. 12550 ACTIVE.USER.NAME$ = MID$(FIRST.NAME$ + " " + LAST.NAME$,1,31)
  3737.       Z$ = FIRST.NAME$
  3738.       RETURN
  3739. '
  3740. ' *****************************************************************************
  3741. ' *  CHECK FOR NAMES NOT ALLOWED                                              *
  3742. ' *****************************************************************************
  3743. '
  3744. 12570 FOUND = FALSE
  3745.       SWAP TRASHCAN.FILE$,FILE.NAME$
  3746.       GOSUB 58000
  3747.       SWAP TRASHCAN.FILE$,FILE.NAME$
  3748.       IF BADNEWS = 53 THEN _
  3749.          GOTO 710
  3750. 12580 IF EOF(2) THEN _
  3751.          GOTO 1495
  3752.       INPUT #2,INVALID.NAME$
  3753.       IF Z$ <> INVALID.NAME$ THEN _
  3754.          GOTO 12580
  3755.       FOUND = TRUE
  3756.       RETURN
  3757. 12595 A$ = "Real name required.  Call traced & recorded."
  3758.       GOSUB 1405
  3759.       GOTO 10698
  3760. '
  3761. ' *****************************************************************************
  3762. ' *  COMMON SEARCH USER FILE ROUTINE                                          *
  3763. ' *****************************************************************************
  3764. '
  3765. 12600 GOSUB 4910
  3766.       GOSUB 26000
  3767.       A$ = "Checking Users..."
  3768.       GOSUB 1400
  3769. 12605 GOSUB 9400
  3770.       X$ = FN S$(TEMP.USER.NAME$,31)
  3771.       DF = (ASC(MID$(TEMP.USER.NAME$,2,1))*10  + 7) MOD _
  3772.            HIGHEST.USER.RECORD
  3773.       USER.FILE.INDEX = _
  3774.            ((ASC(TEMP.USER.NAME$)*100  + _
  3775.              ASC(MID$(TEMP.USER.NAME$,LEN(TEMP.USER.NAME$) / 2,1)) * _
  3776.              10  + _
  3777.              ASC(RIGHT$(TEMP.USER.NAME$,1))) _
  3778.              MOD HIGHEST.USER.RECORD) + 1
  3779.       IX = 0
  3780. 12610 GET 2,USER.FILE.INDEX
  3781.       IF X$ = USER.NAME$ THEN _
  3782.          FOUND = TRUE : _
  3783.          RETURN
  3784.       IF USER.NAME$ = SPACE$(31) THEN _
  3785.          IF CURRENT.USER.COUNT >= HIGHEST.USER.RECORD*.95 THEN _
  3786.             Z$ = "No room for new users" + GRN$ : _
  3787.             A$ = Z$ : _
  3788.             GOSUB 13670 : _
  3789.             GOSUB 1397 : _
  3790.             USER.FILE.INDEX = 0 : _
  3791.             FOUND = FALSE : _
  3792.             RETURN _
  3793.          ELSE USER.FILE.INDEX = IX-(IX = 0)*USER.FILE.INDEX : _
  3794.               FOUND = FALSE : _
  3795.               RETURN
  3796.       IF ASC(USER.NAME$) = 0 OR LEFT$(USER.NAME$,7) = "NEWUSER" THEN _
  3797.          IF IX = 0 THEN _
  3798.             IX = USER.FILE.INDEX
  3799. 12620 USER.FILE.INDEX = USER.FILE.INDEX + DF
  3800.       IF USER.FILE.INDEX > HIGHEST.USER.RECORD-1 THEN _
  3801.          USER.FILE.INDEX = USER.FILE.INDEX-HIGHEST.USER.RECORD
  3802.       GOTO 12610
  3803. 12630 GOSUB 23000
  3804.       CURRENT.USER.COUNT = CURRENT.USER.COUNT-(IX = 0)
  3805.       GOSUB 24000
  3806.       GOSUB 25000
  3807.       GOSUB 26500
  3808.       GOSUB 27000
  3809.       RETURN
  3810. '
  3811. ' *****************************************************************************
  3812. ' *  INFORM USER OF WHAT CONFERENCE USER FILE HE IS VIEWING                   *
  3813. ' *****************************************************************************
  3814. '
  3815. 12700 IF CONFERENCE.MODE THEN _
  3816.          A$ = "Users of " + GRN$ + ":" : _
  3817.          GOSUB 1405
  3818.       RETURN
  3819. '
  3820. ' *****************************************************************************
  3821. ' *  GET PASSWORD FROM NEWUSER                                                *
  3822. ' *****************************************************************************
  3823. '
  3824. 12800 A$ = "Enter PASSWORD you'll use to logon again"
  3825.       GOSUB 1500
  3826.       IF B$(1) = SPACE$(LEN(B$(1))) THEN _
  3827.          GOTO 12800
  3828.       IF LEN(B$(1)) > 15 THEN _
  3829.          A$ = "15 Char. Max" : _
  3830.          GOSUB 1405 : _
  3831.          GOTO 12800
  3832.       Z$ = FN UC$(B$(1))
  3833.       LSET PASSWORD$ = Z$
  3834.       RETURN
  3835. '
  3836. ' *****************************************************************************
  3837. ' *  SET NEWUSER DEFAULTS                                                     *
  3838. ' *****************************************************************************
  3839. '
  3840. 12900 LSET USER.NAME$ = ACTIVE.USER.NAME$
  3841.       LSET USER.OPTIONS$ = MKI$(0) + _
  3842.                            MKI$(0) + _
  3843.                            " 0" + _
  3844.                            MKI$(64) + _
  3845.                            MKI$(16) + _
  3846.                            MKI$(0) + _
  3847.                            CHR$(PAGE.LENGTH) + _
  3848.                            STRING$(1,0)
  3849.       LSET USER.DOWNLOADS$ = MKI$(0)
  3850.       LSET USER.UPLOADS$ = MKI$(0)
  3851.       LSET SECURITY.LEVEL$ = MKI$(TEMP.SECURITY.LEVEL)
  3852.       LSET ELAPSED.TIME$ = MKI$(0)
  3853.       RETURN
  3854. '
  3855. ' *****************************************************************************
  3856. ' *  GET MACHINE TYPE CALLING FROM                                            *
  3857. ' *****************************************************************************
  3858. '
  3859. 12950 A$ = "What type of system are you calling from (Press [ENTER] if " + _
  3860.            DEFAULT.MACHINE.TYPE$ + _
  3861.            ")"
  3862.       GOSUB 1500
  3863.       IF Q = 0 THEN _
  3864.          LSET MACHINE.TYPE$ = DEFAULT.MACHINE.TYPE$ _
  3865.       ELSE LSET MACHINE.TYPE$ = FN UC$(B$(1))
  3866. '
  3867. ' *****************************************************************************
  3868. ' *  GET CITY AND STATE FROM NEWUSER                                          *
  3869. ' *****************************************************************************
  3870. '
  3871. 12960 A$ = A1$ + "CITY and STATE"
  3872.       GOSUB 1500
  3873.       IF Q = 0 THEN _
  3874.          GOTO 12960
  3875.       LSET CITY.STATE$ = FN UC$(B$(1))
  3876.       CI$ = FN UC$(B$(1)) + SPACE$(2)
  3877.       RETURN
  3878. '
  3879. ' *****************************************************************************
  3880. ' *  S - COMMAND FROM 5 - USER MAINTENANCE OPTIONS (SCAN USERS)               *
  3881. ' *****************************************************************************
  3882. '
  3883. 12962 X = 0
  3884.       FF = FALSE
  3885.       A$ = "String to search (Press [ENTER] to quit)"
  3886.       GOSUB 1500
  3887.       IF Q = 0 THEN _
  3888.          GOTO 11000
  3889.       R$ = FN UC$(B$(1))
  3890. 12963 GET 2,I
  3891.       GOSUB 12966
  3892.       X = INSTR(SCAN.FIELD$,R$)
  3893.       IF X > 0 THEN _
  3894.          GOTO 11015
  3895.       IF I > HIGHEST.USER.RECORD-1 THEN _
  3896.          GOTO 11000
  3897. 12965 I = I + 1
  3898.       X = 0
  3899.       GOTO 12963
  3900. 12966 FF = INSTR("NCPSL",SCAN.FUNCTION$)
  3901.       IF FF = 0 THEN _
  3902.          GOTO 11000
  3903. 12967 ON FF GOTO 12968,12969,12970,12971,12972
  3904. '
  3905. ' *****************************************************************************
  3906. ' *  N - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR NAME)    *
  3907. ' *****************************************************************************
  3908. '
  3909. 12968 SCAN.FIELD$ = USER.NAME$
  3910.       RETURN
  3911. '
  3912. ' *****************************************************************************
  3913. ' *  C - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR CITY/ST) *
  3914. ' *****************************************************************************
  3915. '
  3916. 12969 SCAN.FIELD$ = CITY.STATE$
  3917.       RETURN
  3918. '
  3919. ' *****************************************************************************
  3920. ' *  P - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR PASSWORD)*
  3921. ' *****************************************************************************
  3922. '
  3923. 12970 SCAN.FIELD$ = PASSWORD$
  3924.       RETURN
  3925. '
  3926. ' *****************************************************************************
  3927. ' *  S - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR SYSTEM)  *
  3928. ' *****************************************************************************
  3929. '
  3930. 12971 SCAN.FIELD$ = MACHINE.TYPE$
  3931.       RETURN
  3932. '
  3933. ' *****************************************************************************
  3934. ' *  L - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR LEVEL)   *
  3935. ' *****************************************************************************
  3936. '
  3937. 12972 SCAN.FIELD$ = STR$(CVI(SECURITY.LEVEL$))
  3938.       RETURN
  3939. '
  3940. ' *****************************************************************************
  3941. ' *  MAIN SYSTEM ERROR TRAP - ALL ERRORS PASS THROUGH THIS ROUTINE            *
  3942. ' *****************************************************************************
  3943. '
  3944. 13000 ' PRINT ERR,ERL 
  3945.       IF ERR = 7 THEN _
  3946.          GOTO 13650
  3947. 13010 IF ERL = 130 THEN _
  3948.          CALLERS.FILE.INDEX = 1 : _
  3949.          RESUME 135
  3950. 13020 IF ERL = 230 AND (ERR = 24 OR ERR = 25 OR ERR = 27 OR ERR = 68) THEN _
  3951.          PRINTER = FALSE : _
  3952.          RESUME 230
  3953. 13021 IF ERL = 275 AND ERR = 57 THEN _
  3954.          LINE.STATUS = INP(LINE.STATUS.REGISTER) : _
  3955.          RESUME 275
  3956. 13022 IF ERL = 324 AND ERR = 57 THEN _
  3957.          LINE.STATUS = INP(LINE.STATUS.REGISTER) : _
  3958.          RESUME 324
  3959. 13025 IF ERL = 677 AND ERR = 5 THEN _
  3960.          RESUME 670
  3961. 13033 IF ERL = 825 AND ERR = 5 THEN _
  3962.          RESUME 830
  3963. 13034 IF ERL = 836 AND (ERR = 24 OR ERR = 25 OR ERR = 27 OR ERR = 68) THEN _
  3964.          PRINTER = FALSE : _
  3965.          RESUME 836
  3966. 13035 IF ERL = 954 AND ERR = 5 THEN _
  3967.          HH = 1 : _
  3968.          LINE.25$ = "" : _
  3969.          RESUME 954
  3970. 13036 IF ERL = 1420 AND ERR = 69 THEN _
  3971.          GOSUB 13660 : _
  3972.          RESUME 13540
  3973. 13037 IF ERL = 1540 AND ERR = 57 THEN _
  3974.          LINE.STATUS = INP(LINE.STATUS.REGISTER) : _
  3975.          RESUME 1540
  3976. 13038 IF ERL = 4371 AND ERR = 6 THEN _
  3977.          RESUME 1200
  3978. 13045 IF ERL = 5130 AND ERR = 63 THEN _
  3979.          RESUME 5160
  3980. 13047 IF ERL = 5150 AND ERR = 62 THEN _
  3981.          RESUME 5160
  3982. 13050 IF ERL = 9400 AND ERR = 75 AND SHARE.IT THEN _
  3983.          FOR I = 1 TO 10 : _
  3984.              GOSUB 50510 : _
  3985.          NEXT : _
  3986.          RESUME 9400
  3987. 13060 IF ERL = 11025 THEN _
  3988.          QQ = 0 : _
  3989.          RESUME 11025
  3990. 13070 IF ERL = 11100 THEN _
  3991.          QQ = 0 : _
  3992.          RESUME 11100
  3993. 13075 IF ERL = 12610 AND ERR = 63 THEN _
  3994.          IF IX = 0 THEN _
  3995.             IX = USER.FILE.INDEX : _
  3996.             RESUME 12620 _
  3997.          ELSE RESUME 12620
  3998. 13080 IF ERL = 13674 THEN _
  3999.          PRINTER = FALSE : _
  4000.          RESUME 13674
  4001. 13087 IF ERL = 20242 AND ERR = 62 THEN _
  4002.          RESUME 20247
  4003. 13090 IF ERR = 58 THEN _
  4004.          GOTO 13130
  4005. 13100 IF (ERR = EC AND (FN TI! - TKA! < 5)) THEN _
  4006.          EA = EA + 1 : _
  4007.          IF EA > 10 THEN _
  4008.             GOTO 13800
  4009. 13120 EC = ERR
  4010.       IF FN TI! - TKA! > 5 THEN _
  4011.          EA = 0 _
  4012.       ELSE TKA! = FN TI!
  4013. 13130 IF ERL = 117 AND ERR = 53 THEN _
  4014.          DF$ = CONFIG.FILENAME$ : _
  4015.          GOTO 13600
  4016. 13135 IF ERL = 122 AND ERR = 62 THEN _
  4017.          DF$ = CONFIG.FILENAME$ : _
  4018.          GOTO 13600
  4019. 13150 IF ERL = 346 THEN _
  4020.          IF ERR = 53 THEN _
  4021.             RESUME 400 _
  4022.          ELSE IF ERR = 58 THEN _
  4023.                  RESUME 347
  4024. 13180 IF ERL = 1420 AND ERR = 57 THEN _
  4025.          LINE.STATUS = INP(LINE.STATUS.REGISTER) : _
  4026.          RESUME 1425
  4027. 13190 IF ERL = 1540 OR _
  4028.          ERL = 3737 OR _
  4029.          ERL = 20840 OR _
  4030.          ERL = 21281 OR _
  4031.          ERL = 21360 OR _
  4032.          ERL = 21420 THEN _
  4033.          GOSUB 50500 : _
  4034.          IF INP(MODEM.STATUS.REGISTER) < 128 THEN _
  4035.             RESUME 10595
  4036. 13200 IF ERL = 1540 THEN _
  4037.          RESUME 1540
  4038. 13220 IF ERL = 3737 THEN _
  4039.          RESUME 3737
  4040. 13230 IF ERL = 4797 THEN _
  4041.          GOSUB 50500 : _
  4042.          Z$ = A$ : _
  4043.          GOSUB 13670 : _
  4044.          IF INP(MODEM.STATUS.REGISTER) < 128 THEN _
  4045.             RESUME 10595 _
  4046.          ELSE RESUME 4797
  4047. 13232 IF ERL = 4905 THEN _
  4048.          IF ERR = 53 THEN _
  4049.             RESUME 4910 _
  4050.          ELSE IF ERR = 58 THEN _
  4051.                  RESUME 4906
  4052. 13237 IF ERL = 5300 THEN _
  4053.          IF ERR = 53 THEN _
  4054.             A$ = "There are no Active Conferences available!" : _
  4055.             GOSUB 1399 : _
  4056.             RESUME 2210 _
  4057.          ELSE RESUME 5310
  4058. 13238 IF ERL = 5324 THEN _
  4059.          IF ERR = 53 OR ERR = 64 THEN _
  4060.             ACTIVE.MESSAGE.FILE$ = MAIN.MESSAGE.FILE$ : _
  4061.             GRN$ = "" : _
  4062.             RESUME 5312 _
  4063.          ELSE RESUME 5325
  4064. 13240 IF ERL = 5328 THEN _
  4065.          IF ERR = 53 OR ERR = 64 THEN _
  4066.             ACTIVE.USER.FILE$ = MAIN.USER.FILE$: _
  4067.             UPDATE.DATE = FALSE : _
  4068.             GOSUB 21990 : _
  4069.             GET 1,1 : _
  4070.             MID$(MESSAGE.RECORD$,57,5) = STR$(CURRENT.USER.COUNT) : _
  4071.             MID$(MESSAGE.RECORD$,62,5) = STR$(HIGHEST.USER.RECORD) : _ 
  4072.             PUT 1,1 : _
  4073.             GOSUB 25000 : _
  4074.             TIX = MAIN.USER.FILE.INDEX : _
  4075.             RESUME 5345 _
  4076.          ELSE RESUME 5330
  4077. 13245 IF ERL = 5536 AND ERR = 57 THEN _
  4078.          LINE.STATUS = INP(LINE.STATUS.REGISTER) : _
  4079.          RESUME 20015
  4080. 13250 IF ERL = 5536 THEN _
  4081.          RESUME 5530
  4082. 13260 IF ERL = 7110 THEN _
  4083.          RESUME 6080
  4084. 13270 IF ERL = 7130 AND ERR = 52 THEN _
  4085.          RESUME 7260
  4086. 13280 IF ERL = 10601 AND ERR = 63 THEN _
  4087.          GOTO 10595
  4088. 13310 IF ERL = 10721 THEN _
  4089.          IF ERR = 53 OR ERR = 64 THEN _
  4090.             RESUME 1495
  4091. 13312 IF ERL = 10986 AND ERR = 58 THEN _
  4092.          RESUME 10987
  4093. 13314 IF ERL = 10986 THEN _
  4094.          A$ = "Door " + Z$ + " closed" + ". Please tell SYSOP" : _
  4095.          GOSUB 1405 : _
  4096.          RESUME 1200
  4097. 13355 IF ERL = 20165 AND ERR = 58 THEN _
  4098.          RESUME 20167
  4099. 13357 IF ERL = 20165 THEN _
  4100.          RESUME 20170
  4101. 13360 IF ERL = 20221 AND ERR = 53 THEN _
  4102.          RESUME 20225
  4103. 13370 IF ERL = 20221 AND ERR = 58 THEN _
  4104.          OK = TRUE : _
  4105.          RESUME 20225
  4106. 13372 IF (ERL = 20221 AND ERR = 64) OR _
  4107.          (ERL = 20221 AND ERR = 75) THEN _
  4108.          A$ = "Invalid file name" : _
  4109.          GOSUB 1405 : _
  4110.          RESUME 20200
  4111. 13380 IF ERL = 20441 AND ERR = 58 THEN _
  4112.          OK = FALSE : _
  4113.          RESUME 20450
  4114. 13383 IF (ERL = 20441 AND ERR = 64) OR _
  4115.          (ERL = 20441 AND ERR = 75) THEN _
  4116.          A$ = "Invalid file name" : _
  4117.          GOSUB 1405 : _
  4118.          RESUME 20420
  4119. 13385 IF ERL = 20441 AND ERR = 53 THEN _
  4120.          RESUME 20450
  4121. 13390 IF ERL = 20450 THEN _
  4122.          OK = FALSE : _
  4123.          RESUME 20455
  4124. 13400 IF ERL = 20620 THEN _
  4125.          OK = FALSE : _
  4126.          RESUME 20621
  4127. 13402 IF ERL = 20661 AND ERR = 55 THEN _
  4128.          RESUME 20662
  4129. 13405 IF ERL = 20736 AND ERR = 53 THEN _
  4130.          RESUME 1495
  4131. 13410 IF ERL = 20840 THEN _
  4132.          RESUME 20840
  4133. 13420 IF ERL = 21130 THEN _
  4134.          OK = FALSE : _
  4135.          RESUME 21131
  4136. 13430 IF ERL = 21281 THEN _
  4137.          RESUME 21281
  4138. 13440 IF ERL = 21360 THEN _
  4139.          RESUME 21360
  4140. 13442 IF ERL = 21420 THEN _
  4141.          RESUME 21420
  4142. 13443 IF ERL = 43031 AND ERR = 58 THEN _
  4143.          OK = TRUE : _
  4144.          RESUME 43032
  4145. 13445 IF ERL = 43031 AND ERR = 53 THEN _
  4146.          RESUME 43032
  4147. 13446 IF ERL = 52001 AND ERR = 53 THEN _
  4148.          IF Z$ = COMMENTS.FILE$ THEN _
  4149.             CLOSE 2 : _
  4150.             OPEN "O",2,COMMENTS.FILE$ : _
  4151.             CLOSE 2 : _
  4152.             RESUME 52000
  4153. 13447 IF ERL = 52001 AND ERR = 53 THEN _
  4154.          A$ = "Upload directory file missing. Please tell SYSOP" : _
  4155.          GOSUB 1405 : _
  4156.          RESUME 20015
  4157. 13448 IF ERL = 58000 AND ERR = 52 THEN _
  4158.          RESUME 58010
  4159. 13449 IF ERL = 58020 AND ERR = 53 THEN _
  4160.          BADNEWS = 53 : _
  4161.          RESUME 58030
  4162. 13450 IF 65535! = ERL THEN _
  4163.          GOTO 13800
  4164. 13460 IF ERR = 5 THEN _
  4165.          GOTO 10595
  4166. 13470 IF ERR = 57 OR ERR = 24 OR ERR = 25 THEN _
  4167.          GOSUB 50500 : _
  4168.          MODEM.STATUS = INP(MODEM.STATUS.REGISTER) : _
  4169.          IF MODEM.STATUS < 128 THEN _
  4170.             RESUME 10595
  4171. 13480 IF ERR = 61 THEN _
  4172.          A$ = "* Disk full - terminating *" : _
  4173.          GOSUB 1399 : _
  4174.          GOSUB 33090 : _
  4175.          GOSUB 13660 : _
  4176.          RESUME 13540
  4177. 13490 IF ERR = 71 THEN _
  4178.          GOSUB 13630 : _
  4179.          RESUME 20015
  4180. 13500 GOSUB 13660
  4181.       A$ = A$ + ". Please tell SYSOP"
  4182.       GOSUB 1405
  4183.       RESUME 1200
  4184. '
  4185. ' *****************************************************************************
  4186. ' * COMMON EXIT FROM RBBS-PC (I.E. "ABANDON ALL HOPE OH YE WHO ENTER HERE")   *
  4187. ' *****************************************************************************
  4188. '
  4189. 13540 IF LOCAL.USER THEN _
  4190.          GOTO 13549
  4191. 13543 IF NOT SYSOP THEN _
  4192.          IF USER.FILE.INDEX = 0 OR NEW.USER = TRUE THEN _
  4193.             GOTO 13549
  4194. 13545 GOSUB 43050
  4195. 13549 GOSUB 13700
  4196.       GOSUB 13550
  4197.       GOSUB 21990
  4198.       GET 1,NODE.RECORD.INDEX
  4199.       EXIT.TO.DOORS = FALSE
  4200.       MID$(MESSAGE.RECORD$,57,1) = "I"
  4201.       MID$(MESSAGE.RECORD$,40,2) = STR$(EXIT.TO.DOORS)
  4202.       PUT 1,NODE.RECORD.INDEX
  4203.       GOSUB 21996
  4204.       CLOSE
  4205.       GOSUB 50500
  4206.       OPEN COM.PORT$+":"+MODEM.INIT.BAUD$+",N,8,1,RS,CD,DS" AS #3
  4207.       A$=MODEM.RESET.COMMAND$
  4208.       GOSUB 52070
  4209.       GOSUB 50500
  4210.       CLOSE
  4211.       IF RECYCLE.TO.DOS THEN _
  4212.          GOTO 31000 _
  4213.       ELSE RUN 100
  4214. 13550 IF LOCAL.USER THEN _
  4215.          RETURN
  4216. 13560 GOSUB 50510
  4217.       OUT MODEM.CONTROL.REGISTER,INP(MODEM.CONTROL.REGISTER) AND 254
  4218.       GOSUB 50500
  4219.       OUT MODEM.CONTROL.REGISTER,INP(MODEM.CONTROL.REGISTER) OR 1
  4220.       RETURN
  4221. 13600 CLS
  4222.       LOCATE ,,0
  4223.       PRINT DF$;" file not found/invalid.  Run CONFIG."
  4224.       GOSUB 50510
  4225.       GOTO 31000
  4226. 13630 A$ = "File Menu not available."
  4227.       GOSUB 1405
  4228.       RETURN
  4229. 13650 CLS
  4230.       LOCATE ,,0
  4231.       PRINT "Not enough memory for RBBS"
  4232.       GOSUB 50510
  4233.       GOTO 31000
  4234. 13660 A$ = "+++ Error " + _
  4235.            STR$(ERR) + _
  4236.            " line " + _
  4237.            STR$(ERL) + _
  4238.            " at " + _
  4239.            TIME$ + _
  4240.            " on " + _
  4241.            DATE$
  4242.       Z$ = A$
  4243.       GOTO 13666
  4244. '
  4245. ' *****************************************************************************
  4246. ' * EXTENDED LOGGING ENTRY                                                    *
  4247. ' *****************************************************************************
  4248. '
  4249. 13665 IF NOT EXTENDED.LOGGING THEN _
  4250.          RETURN
  4251. 13666 GOSUB 41510
  4252.       Z$ = Z$ + " at " + TIM$
  4253. '
  4254. ' *****************************************************************************
  4255. ' * UPDATE CALLERS FILE WITH USER ACTIVITY                                    *
  4256. ' *****************************************************************************
  4257. '
  4258. 13670 Z$ = SPACE$(5) + Z$
  4259.       IF NOT LOCAL.USER THEN _
  4260.          LSET CALLERS.RECORD$ = Z$ : _
  4261.          CALLERS.FILE.INDEX = CALLERS.FILE.INDEX + 1 : _
  4262.          PUT 4,CALLERS.FILE.INDEX
  4263. 13674 IF PRINTER THEN _
  4264.          LPRINT Z$
  4265.       RETURN
  4266. 13700 IF MESSAGE.FILE.LOCK THEN _
  4267.          GOSUB 25000
  4268. 13710 IF USER.FILE.LOCK THEN _
  4269.          GOSUB 27000
  4270. 13720 IF USER.BLOCK.LOCK THEN _
  4271.          GOSUB 27500
  4272.       RETURN
  4273. '
  4274. ' *****************************************************************************
  4275. ' *  FATAL ERROR HAS OCCURED!  RECYCLE SYSTEM IMMEDIATELY                     *
  4276. ' *****************************************************************************
  4277. '
  4278. 13800 A$ = "Fatal error!"
  4279.       GOSUB 1405
  4280.       GOTO 10595
  4281. '
  4282. ' *****************************************************************************
  4283. ' *         TAKE THE PHONE OFF THE HOOK FOR LOCAL SYSOP MAINTENANCE           *
  4284. ' *****************************************************************************
  4285. '
  4286. 14500 A$ = MODEM.GO.OFFHOOK.COMMAND$
  4287.       GOSUB 52070
  4288.       CLOSE 3
  4289.       RETURN
  4290. '
  4291. ' *****************************************************************************
  4292. ' *                                                                           *
  4293. ' *                          FILES MENU PROCESSING                            *
  4294. ' *                                                                           *
  4295. ' *****************************************************************************
  4296. '
  4297. 20015 GOSUB 49000
  4298.       ACTIVE.MENU$ = "F"
  4299.       GOSUB 41050
  4300.       NON.STOP = FALSE
  4301.       IF NOT EXPERT.USER THEN _
  4302.          FILE.NAME$ = MENU$(3) : _
  4303.          GOSUB 43025
  4304. 20030 A$ = GRN$ + " File Function <D,G,H,L,N,Q,S,U,X,?>"
  4305.       GOSUB 1499
  4306.       IF Q = 0 THEN _
  4307.          GOTO 20015
  4308. 20050 LIST.NEW = FALSE
  4309.       Z$ = FN UC$(B$(1))
  4310.       FF = INSTR("DGHLNQSUX?",Z$)
  4311.       IF FF = 0 THEN _
  4312.          J = 1 : _
  4313.          GOSUB 1360 : _
  4314.          GOTO 20015
  4315.       IF USER.SECURITY.LEVEL < FILES.FUNCTION(FF) THEN _
  4316.          VIOLATION$ = "File " + Z$ : _
  4317.          GOSUB 1380 : _
  4318.          GOTO 20015
  4319. 20070 ON FF GOSUB 20180,20100,20110,20150,53000,20090,52900,20400,4240,20130
  4320.       GOTO 20015
  4321. '
  4322. ' *****************************************************************************
  4323. ' *  Q - COMMAND FROM FILES MENU (QUIT)                                       *
  4324. ' *****************************************************************************
  4325. '
  4326. 20090 RETURN 20095
  4327. '
  4328. ' *****************************************************************************
  4329. ' *  C/R - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (QUIT TO MAIN MENU)*
  4330. ' *****************************************************************************
  4331. '
  4332. 20093 IF USER.FILE.INDEX > 0 THEN _
  4333.          GOSUB 9400 : _
  4334.          GET 2,USER.FILE.INDEX : _
  4335.          GOSUB 9500
  4336. 20095 RETURN 1200
  4337. '
  4338. ' *****************************************************************************
  4339. ' *  G - COMMAND FROM FILES MENU (GOODBYE)                                    *
  4340. ' *****************************************************************************
  4341. '
  4342. 20100 RETURN 10560
  4343. '
  4344. ' *****************************************************************************
  4345. ' *  H - COMMAND FROM FILES MENU (HELP)                                       *
  4346. ' *****************************************************************************
  4347. '
  4348. 20110 FILE.NAME$ = HELP$(5)
  4349.       GOSUB 1790
  4350.       RETURN
  4351. '
  4352. ' *****************************************************************************
  4353. ' *  ? - COMMAND FROM FILES MENU (EXTRA HELP)                                 *
  4354. ' *****************************************************************************
  4355. '
  4356. 20130 FILE.NAME$ = HELP$(6)
  4357.       GOSUB 1790
  4358.       RETURN
  4359. '
  4360. ' *****************************************************************************
  4361. ' *  L - COMMAND FROM FILES MENU (LIST DIRECTORY)                             *
  4362. ' *****************************************************************************
  4363. '
  4364. 20150 LIST.DIRECTORY = TRUE
  4365.       IF Q < 2 THEN _
  4366.          Q = 2 : _
  4367.          B$(Q) = DIRECTORY.EXTENTION$
  4368. 20160 X = 2
  4369.       QX = Q
  4370. 20161 IF X > QX THEN _
  4371.          RETURN
  4372.       IF INSTR(B$(X),".") THEN _
  4373.          GOTO 20172
  4374. 20162 FOR SUBDIR.INDEX = 1 TO SUBDIR.COUNT
  4375.         FILE.NAME$ = SUBDIR$(SUBDIR.INDEX) + _
  4376.                      B$(X) + _
  4377.                      "." + _
  4378.                      DIRECTORY.EXTENTION$
  4379.         GOSUB 43030
  4380. 20165   NAME FILE.NAME$ AS FILE.NAME$
  4381. 20167   IF LIST.NEW THEN _
  4382.            GOSUB 7000 : _
  4383.            GOTO 20175
  4384.         GOSUB 6000
  4385.         GOTO 20175
  4386. 20170 NEXT
  4387. 20172 A$ = "Directory " + B$(X) + " not found!"
  4388.       GOSUB 1400
  4389. 20175 X = X + 1
  4390.       GOTO 20161
  4391. '
  4392. ' *****************************************************************************
  4393. ' *  D - COMMAND FROM FILES MENU (SEARCH FOR FILE TO DOWNLOAD)                *
  4394. ' *****************************************************************************
  4395. '
  4396. 20180 IF Q > 1 THEN _
  4397.          B = 2 : _
  4398.          GOTO 20202
  4399. 20200 A$ = "Enter full filename to download"
  4400.       GOSUB 1500
  4401.       B = 1
  4402.       IF Q = 0 THEN _
  4403.          RETURN
  4404. 20202 START.DRIVE = 1
  4405.       IF Q > B THEN _
  4406.          START.DRIVE = VAL(B$(B + 1)) : _
  4407.          IF START.DRIVE < 1 THEN _
  4408.             START.DRIVE = 1
  4409. 20205 Z$ = B$(B)
  4410.       VIOLATION$ = "Download "
  4411.       FOR SUBDIR.INDEX = START.DRIVE TO (SUBDIR.COUNT) + (NOT SYSOP)
  4412.         GOSUB 20741
  4413.         ON BAD.FILE.NAME.INDEX GOTO 20220,20231
  4414. 20220   OK = FALSE
  4415. 20221   NAME FILE.NAME$ AS FILE.NAME$
  4416. 20225   IF OK THEN _
  4417.            GOTO 20235
  4418. 20230 NEXT
  4419. 20231 Z$ = B$(B) + " not found!"
  4420.       GOSUB 13670
  4421.       A$ = Z$ + " Type L for directory"
  4422.       GOSUB 1400
  4423.       RETURN 20015
  4424. '
  4425. ' *****************************************************************************
  4426. ' *  TEST FOR SYSTEM FILE ATTEMPT                                             *
  4427. ' *****************************************************************************
  4428. '
  4429. 20235 Z$ = FILE.NAME$
  4430.       A$ = ACTIVE.MESSAGE.FILE$
  4431.       GOSUB 43040
  4432.       A$ = MAIN.MESSAGE.BACKUP$
  4433.       GOSUB 43040
  4434.       A$ = COMMENTS.FILE$
  4435.       GOSUB 43040
  4436.       A$ = ACTIVE.USER.FILE$
  4437.       GOSUB 43040
  4438.       A$ = ACTIVE.USER.FILE$ + ".BAK"
  4439.       GOSUB 43040
  4440.       A$ = CALLERS.FILE$
  4441.       GOSUB 43040
  4442.       A$ = RBBS.BAT$
  4443.       GOSUB 43040
  4444.       A$ = RCTTY.BAT$
  4445.       GOSUB 43040
  4446.       A$ = PASSWORDS.FILE$
  4447.       GOSUB 43040
  4448.       A$ = FILESEC.FILE$
  4449.       GOSUB 43040
  4450.       LINE.25$ = "(D) " + Z$
  4451. '
  4452. ' *****************************************************************************
  4453. ' *  TEST FOR DOWNLOAD SECURITY                                               *
  4454. ' *****************************************************************************
  4455. '
  4456.       SWAP FILESEC.FILE$,FILE.NAME$
  4457.       GOSUB 58000
  4458.       SWAP FILESEC.FILE$,FILE.NAME$
  4459.       IF BADNEWS = 53 THEN _
  4460.          Z$ = "Missing file " + FILESEC.FILE$ : _
  4461.          GOSUB 13670 : _
  4462.          GOTO 20247
  4463.       N$ = Z$
  4464.       GOSUB 20282
  4465.       LG$(9) = DR$
  4466.       LG$(8) = X$
  4467.       LG$(10) = EXTENTION$
  4468. 20242 IF EOF(2) THEN _
  4469.          GOTO 20247 _
  4470.       ELSE INPUT #2,N$,FILE.SECURITY,FILE.PASSWORD$ : _
  4471.            GOSUB 20282
  4472. 20243 IF DR$ <> "" AND DR$ <> LG$(9) THEN _
  4473.          GOTO 20242
  4474.       A$ = LG$(8)
  4475.       Z$ = X$
  4476.       GOSUB 20285
  4477.       IF OK THEN _
  4478.          GOTO 20242
  4479.       A$ = LG$(10)
  4480.       Z$ = EXTENTION$
  4481.       GOSUB 20285
  4482.       IF OK THEN _
  4483.          GOTO 20242
  4484. 20244 IF USER.SECURITY.LEVEL < FILE.SECURITY THEN _
  4485.          GOTO 20245
  4486.       IF FILE.PASSWORD$ = "" THEN _
  4487.          GOTO 20247
  4488.       FILE.PASSWORD$ = FN UC$(FILE.PASSWORD$)
  4489.       IF FILE.PASSWORD$ = PASSWORD$ THEN _
  4490.          GOTO 20247
  4491.       A$ = "Enter PASSWORD for downloading " + FILE.NAME$
  4492.       GOSUB 1500
  4493.       IF Q = 0 THEN _
  4494.          RETURN 20015                                                ' CPC141A4
  4495.       IF FN UC$(B$(1)) = FILE.PASSWORD$ THEN _
  4496.          GOTO 20247
  4497. 20245 VIOLATION$ = "DownLoad " + FILE.NAME$
  4498.       GOSUB 1380
  4499.       RETURN 20015
  4500. 20247 DF = 0
  4501.       EXTENTION$ = RIGHT$(FILE.NAME$,4)
  4502.       IF INSTR(".WRK.FW .ARC.EXE.COM.OBJ.WKS.LBR",EXTENTION$) OR _
  4503.          MID$(EXTENTION$,3,1) = "Q" OR _
  4504.          (REQUIRE.NON.ASCII AND EXTENTION$ = ".BAS") THEN _
  4505.          A$ = "Non-ASCII transfer required" : _
  4506.          GOSUB 1405 : _
  4507.          DF = TRUE
  4508. 20248 T$ = "Download" + TRANSFER.OPTIONS$
  4509.       GOSUB 21620
  4510.       IF FF THEN _
  4511.          GOTO 20260
  4512.       GOSUB 21600
  4513. 20260 HH = 1
  4514.       ON FF GOTO 20340,20262,20290,20290,1495
  4515. '
  4516. ' *****************************************************************************
  4517. ' *  TEST FOR MNP PROTOCAL AVAILABLE                                          *
  4518. ' *****************************************************************************
  4519. '
  4520. 20262 IF NOT MNP.SUPPORT THEN _
  4521.          A$ = "MNP unavailable" : _
  4522.          GOSUB 1405 : _
  4523.          ON HH GOTO 1495,1495
  4524.       LL = HH*HH
  4525.       LL = LL-HH
  4526.       GOSUB 20264
  4527.       ON LL + HH GOTO 20385,20266,20660,20730
  4528.       STOP
  4529. '
  4530. ' *****************************************************************************
  4531. ' *  MNP INTERFACE FOR DOWNLOADS & UPLOADS                                    *
  4532. ' *****************************************************************************
  4533. '
  4534. 20264 CLOSE 3
  4535.       OUT MODEM.CONTROL.REGISTER,INP(MODEM.CONTROL.REGISTER) OR 1
  4536.       CALL MNP(HH,FILE.NAME$,COM.PORT$,BPS)
  4537.       OPEN COM.PORT$ + _
  4538.            ":" + _
  4539.            MID$("    300 45012002400",(-4*BPS),4) + _
  4540.            "," + _
  4541.            MID$("N,8,1E,7,",6 + 5*EIGHT.BIT,4) + _
  4542.            "1,RS,CD,DS" AS 3
  4543.       RETURN
  4544. '
  4545. ' *****************************************************************************
  4546. ' *  DOWNLOAD ABORT                                                           *
  4547. ' *****************************************************************************
  4548. '
  4549. 20266 A$ = "<Download aborted>"
  4550.       DOWNLOAD.COMPLETED = FALSE
  4551.       GOTO 20390
  4552. 20282 Z$ = FN UC$(N$)
  4553.       IF MID$(Z$,2,1) = ":" THEN _
  4554.          DR$ = LEFT$(Z$,1) : _
  4555.          S = 3 _
  4556.       ELSE DR$ = "" : _
  4557.            S = 1
  4558. 20283 XXX = INSTR(Z$ + ".",".")
  4559.       X$ = MID$(Z$,S,XXX-S)
  4560.       EXTENTION$ = MID$(Z$,XXX + 1,3)
  4561.       RETURN
  4562. 20285 OK = FALSE
  4563.       K = 0
  4564.       L = LEN(A$)
  4565. 20286 K = K + 1
  4566.       IF K > L THEN _
  4567.          GOTO 20288
  4568.       B$ = MID$(Z$,K,1)
  4569.       IF B$ = "*" THEN _
  4570.          RETURN
  4571. 20287 IF B$ <> "?" AND MID$(A$,K,1) <> B$ THEN _
  4572.          OK = TRUE : _
  4573.          RETURN
  4574.       GOTO 20286
  4575. 20288 IF L < LEN(Z$) AND MID$(Z$,L + 1,1) <> "*" THEN _
  4576.          OK = TRUE
  4577.       RETURN
  4578. '
  4579. ' *****************************************************************************
  4580. ' *  XMODEM DOWNLOAD DRIVER                                                   *
  4581. ' *****************************************************************************
  4582. '
  4583. 20290 CLOSE 2
  4584.       IF SHARE.IT THEN _
  4585.          OPEN FILE.NAME$ FOR RANDOM SHARED AS #2 LEN=128 _
  4586.          ELSE OPEN "R",2,FILE.NAME$,128
  4587.       TLA = 165
  4588.       GOSUB 20750
  4589.       A1$ = "SEND"
  4590.       GOSUB 20320
  4591.       GOSUB 21300
  4592.       A$ = ""
  4593.       GOTO 20390
  4594. 20320 IF NOT EIGHT.BIT THEN _
  4595.          A$ = "Please SWITCH to N,8,1 for binary transfer" : _
  4596.          GOSUB 1398 : _
  4597.          GOSUB 50510
  4598. 20325 XMODEM.TYPE$ = " ": _
  4599.       NEGATIVE.ACKNOWLEDGE$ = CHR$(21): _
  4600.       SOL = 132
  4601.       IF FT$ = "C" THEN _
  4602.          NEGATIVE.ACKNOWLEDGE$ = FT$: _
  4603.          SOL = 133: _
  4604.          XMODEM.TYPE$ = "/CRC "
  4605. 20330 A$ = "XMODEM" + _
  4606.             XMODEM.TYPE$ + _
  4607.             A1$ + _
  4608.             " ready.  <Ctrl X> aborts"
  4609.       GOSUB 1405
  4610.       RETURN
  4611. '
  4612. ' *****************************************************************************
  4613. ' *  ASCII DOWNLOAD DRIVER                                                    *
  4614. ' *****************************************************************************
  4615. '
  4616. 20340 IF DF THEN _
  4617.          A$ = "Switch to XMODEM or MNP" : _
  4618.          GOSUB 1405 : _
  4619.          GOTO 20015
  4620.       GOSUB 58000
  4621.       TLA = 139
  4622.       GOSUB 20750
  4623.       A$ = "* <Ctrl X> aborts <Ctrl S> suspends *"
  4624.       GOSUB 1400
  4625.       A$ = "ASCII SEND ready. Press [ENTER] to start"
  4626.       GOSUB 1500
  4627. 20380 STOP.INTERRUPTS = TRUE
  4628.       GOSUB 6030
  4629.       IF RET THEN _
  4630.          A$ = "<*>Download aborted<*>" : _
  4631.          DOWNLOAD.COMPLETED = FALSE : _
  4632.          GOTO 20390
  4633. 20381 A$ = CHR$(26)
  4634.       GOSUB 1400
  4635.       IF NOT LOCAL.USER AND INP(MODEM.STATUS.REGISTER) > 127 THEN _
  4636.          FOR X = 1 TO 5 : _
  4637.            PRINT #3,CHR$(7) : _
  4638.            GOSUB 50510 : _
  4639.          NEXT
  4640. 20385 A$ = "<End of file>"
  4641.       DOWNLOAD.COMPLETED = TRUE
  4642. 20390 GOSUB 1400
  4643.       GOTO 50600
  4644. '
  4645. ' *****************************************************************************
  4646. ' *  U - COMMAND FROM FILES MENU (UPLOAD)                                     *
  4647. ' *****************************************************************************
  4648. '
  4649. 20400 GOSUB 41010
  4650.       Q! = TCA!
  4651.       IF Q > 1 THEN _
  4652.          B$(1) = B$(2) : _
  4653.          GOTO 20430
  4654. 20420 A$ = "Enter full filename to upload"
  4655.       GOSUB 1500
  4656.       IF Q = 0 THEN _
  4657.          RETURN
  4658. '
  4659. ' *****************************************************************************
  4660. ' *  SEARCH FOR DUPLICATE FILENAME                                            *
  4661. ' *****************************************************************************
  4662. '
  4663. 20430 Z$ = B$(1)
  4664.       VIOLATION$ = "Upload "
  4665.       FOR SUBDIR.INDEX = 1 TO SUBDIR.COUNT
  4666.         GOSUB 20741
  4667.         ON BAD.FILE.NAME.INDEX GOTO 20440,20420
  4668. 20440   OK = TRUE
  4669. 20441   NAME FILE.NAME$ AS FILE.NAME$
  4670. 20450   IF OK THEN _
  4671.            GOTO 20455
  4672. 20451   IF USER.SECURITY.LEVEL >= OVERWRITE.SECURITY.LEVEL THEN _
  4673.            A$ = "Overwrite file" : _
  4674.            GOSUB 1500 : _
  4675.            IF YES THEN _
  4676.               Z$ = FILE.NAME$ : _
  4677.               GOTO 20475
  4678. 20453   CLOSE 2
  4679.         A$ = Z$ + " exists! Please use a new file name"
  4680.         GOSUB 1400
  4681.         GOTO 20420
  4682. 20455 NEXT
  4683.       FILE.NAME.HOLD$ = Z$
  4684.       Z$ = UPLOAD.DIRECTORY$
  4685. 20475 GOSUB 1400
  4686.       GOSUB 52000
  4687.       A$ = "Upload disk has" + FREE.SPACE$
  4688.       GOSUB 1400
  4689.       LINE.25$ = "(U) " + FILE.NAME.HOLD$
  4690.       GOSUB 950
  4691.       T$ = "Upload" + TRANSFER.OPTIONS$
  4692.       IF NOT OK THEN _
  4693.          KILL FILE.NAME$ : _
  4694.          OK = TRUE
  4695. 20477 GOSUB 21620
  4696.       IF FF THEN _
  4697.          GOTO 20500
  4698.       GOSUB 21600
  4699. 20500 HH = 2
  4700.       ON FF GOTO 20560,20262,20540,20540,20735
  4701. 20510 IF SNOOP THEN _
  4702.          PRINT "<Esc> by SYSOP aborts transfer"
  4703.       RETURN
  4704. '
  4705. ' *****************************************************************************
  4706. ' *  XMODEM UPLOAD DRIVER                                                     *
  4707. ' *****************************************************************************
  4708. '
  4709. 20540 A1$ = "RECEIVE"
  4710.       GOSUB 20320
  4711.       OK = TRUE
  4712.       GOSUB 20860
  4713.       IF OK THEN _
  4714.          BLOCKS.IN.FILE# = (CDBL(LOC(2))*128#) : _
  4715.          GOTO 20700
  4716.       GOTO 20730
  4717. '
  4718. ' *****************************************************************************
  4719. ' *  ASCII UPLOAD                                                             *
  4720. ' *****************************************************************************
  4721. '
  4722. 20560 A$ = "Transfer MUST end with a <Ctrl-K>"
  4723.       GOSUB 1400
  4724.       A$ = "ASCII RECEIVE ready"
  4725.       GOSUB 1405
  4726.       OK = FALSE
  4727.       XOFF = FALSE
  4728.       CLOSE 2
  4729.       OPEN "O",2,FILE.NAME$
  4730.       GOSUB 20510
  4731. 20600 WHILE NOT EOF(3)
  4732.         GOSUB 42000
  4733.         IF LOF(3) < 512 AND INP(MODEM.STATUS.REGISTER) >127 THEN _
  4734.            PRINT #3,XOFF$; : _
  4735.            XOFF = TRUE
  4736. 20610   X$ = INPUT$(LOC(3),3)
  4737.         IF INSTR(X$,CHR$(11)) THEN _
  4738.            GOTO 20650
  4739.         OK = TRUE
  4740. 20620   PRINT #2,X$;
  4741.         IF SNOOP THEN _
  4742.            PRINT X$;
  4743. 20621   GOSUB 60000
  4744.         IF KEY.PRESSED$ = ESCAPE$ THEN _
  4745.            GOTO 20745
  4746.         IF NOT OK THEN _
  4747.            GOTO 20670
  4748. 20630 WEND
  4749.       GOSUB 42000
  4750.       IF XOFF AND INP(MODEM.STATUS.REGISTER) > 127 THEN _
  4751.          XOFF = FALSE : _
  4752.          PRINT #3,XON$;
  4753.       GOTO 20600
  4754. 20650 X = INSTR(X$,CHR$(11))
  4755.       IF X <> 1 THEN _
  4756.          PRINT #2,LEFT$(X$,X-1) _
  4757.       ELSE IF NOT OK THEN _
  4758.               GOTO 20730
  4759. 20660 A$ = "Upload complete"
  4760.       GOSUB 1405
  4761. 20661 OPEN "A",2,FILE.NAME$
  4762. 20662 BLOCKS.IN.FILE# = (CDBL(LOC(2))*128#) + 128
  4763.       GOTO 20700
  4764. 20670 A$ = XOFF$ + "System error! Upload aborted <Ctrl-K> continues"
  4765. 20675 GOSUB 1405
  4766.       GOSUB 50510
  4767.       IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  4768.         PRINT #3,XON$;
  4769. 20680 WHILE NOT EOF(3)
  4770.         X$ = INPUT$(LOC(3),3)
  4771.         IF INSTR(X$,CHR$(11)) THEN _
  4772.            GOTO 20730
  4773. 20685   GOSUB 42000
  4774.       WEND
  4775.       GOTO 20680
  4776. '
  4777. ' *****************************************************************************
  4778. ' *  UPDATE UPLOAD DIRECTORY                                                  *
  4779. ' *****************************************************************************
  4780. '
  4781. 20700 BX = &H4
  4782.       EN$ = UPLOAD.DIRECTORY$
  4783.       GOSUB 29000
  4784.       CLOSE 2
  4785.       IF SHARE.IT THEN _
  4786.          OPEN UPLOAD.DIRECTORY$ FOR APPEND SHARED AS #2 _
  4787.       ELSE OPEN "A",2,UPLOAD.DIRECTORY$
  4788.       BX = &H4
  4789.       EN$ = UPLOAD.DIRECTORY$
  4790.       GOSUB 29500
  4791. 20710 A$ = "Describe " + _
  4792.            FILE.NAME.HOLD$ + _
  4793.            " (/ if for SYSOP only)" + _
  4794.            RETURN.LINE.FEED$ + _
  4795.            " |----+---1+0---+---2+0---+---3+0---+---4+0"
  4796.       GOSUB 1398
  4797.       GOSUB 1500
  4798.       IF LEN(B$(1)) > 40 THEN _
  4799.          GOTO 20710
  4800. 20720 IF LEFT$(B$(1),1) = "/" THEN _
  4801.          GOTO 20725
  4802.       PRINT #2,USING "\           \########  &  &"; _
  4803.                      FILE.NAME.HOLD$; _
  4804.                      BLOCKS.IN.FILE#; _
  4805.                      LEFT$(DATE$ ,6) + _
  4806.                      RIGHT$(DATE$ ,2); _
  4807.                      B$(1)
  4808. 20725 CLOSE 2
  4809.       Y$ = " >> uploaded << "
  4810.       UPLOADS = UPLOADS + 1
  4811.       GOSUB 41010
  4812.       SECONDS.PER.SESSION! = SECONDS.PER.SESSION! + _
  4813.                              UPLOAD.TIME.FACTOR! * _
  4814.                              (TCA!-Q!)
  4815.       GOTO 50610
  4816. 20730 A$ = "Upload aborted"
  4817.       GOSUB 1405
  4818. 20735 CLOSE 2
  4819. 20736 KILL FILE.NAME$
  4820.       RETURN
  4821. '
  4822. ' *****************************************************************************
  4823. ' *  TEST FOR INVALID CHARACTERS IN FILENAME                                  *
  4824. ' *****************************************************************************
  4825. '
  4826. 20741 BAD.FILE.NAME.INDEX = 1
  4827.       Z$ = FN UC$(Z$)
  4828.       FILE.NAME$ = SUBDIR$(SUBDIR.INDEX) + Z$
  4829.       IF INSTR(FILE.NAME$,"?") OR _
  4830.          INSTR(FILE.NAME$,"*") OR _
  4831.          INSTR(FILE.NAME$," ") OR _
  4832.          INSTR(3,FILE.NAME$,":") OR _
  4833.          INSTR(FILE.NAME$,".DEF") OR _
  4834.          INSTR(FILE.NAME$,".OLD") OR _
  4835.          MID$(FILE.NAME$,LEN(FILE.NAME$),1) = "." THEN _
  4836.          BAD.FILE.NAME.INDEX = 2 : _
  4837.          RETURN
  4838. 20742 IF LEN(Z$) >= 3 THEN _
  4839.          IF INSTR("COM1:COM2:LPT1:LPT2:LPT3:PRN:CON:AUX",Z$) THEN _
  4840.             VIOLATIONS.THIS.SESSION = MAXIMUM.VIOLATIONS : _
  4841.             VIOLATION$ = VIOLATION$ + Z$ : _
  4842.             GOSUB 1380
  4843. 20743 RETURN
  4844. '
  4845. ' *****************************************************************************
  4846. ' *  SYSOP ABORTED UPLOAD                                                     *
  4847. ' *****************************************************************************
  4848. '
  4849. 20745 A$ = XOFF$ + "SYSOP aborted upload. Stop tranfer. <Ctrl-K> continues"
  4850.       GOTO 20675
  4851. '
  4852. ' *****************************************************************************
  4853. ' *  CALCULATE DOWNLOAD TIME ESTIMATE                                         *
  4854. ' *****************************************************************************
  4855. '
  4856. 20750 IX# = FIX(LOF(2) / 128)
  4857.       BLOCKS.IN.FILE# = LOF(2) / 128
  4858.       IF IX# <> BLOCKS.IN.FILE# THEN _
  4859.          BLOCKS.IN.FILE# = BLOCKS.IN.FILE# + 1
  4860. 20780 A$ = STR$(INT(BLOCKS.IN.FILE#)) + " blocks in file"
  4861.       GOSUB 1405
  4862.       BLOCKS.IN.FILE# = BLOCKS.IN.FILE# * _
  4863.                         TLA / _
  4864.                         VAL(MID$("00030045120240",-3*BPS,3))
  4865.       IF LOF(2) < 1 THEN _
  4866.          GOTO 20015
  4867. 20790 GOSUB 950
  4868.       A$ = "Transfer time:" + _
  4869.            STR$(INT(BLOCKS.IN.FILE# / 60)) + _
  4870.            " minutes," + STR$(BLOCKS.IN.FILE# MOD 60) + _
  4871.            " seconds"
  4872.       GOSUB 1405
  4873.       GOSUB 41000
  4874.       IF (INT(BLOCKS.IN.FILE# / 60) + 1) > INT(TIME.REMAINING!) THEN _
  4875.          A$ = "Not enough time left!" : _
  4876.          Z$ = FILE.NAME$ + " " + A$ : _
  4877.          GOSUB 1405 : _
  4878.          GOSUB 13670 : _
  4879.          GOTO 20015 _
  4880.       ELSE RETURN
  4881. 20810 GOSUB 42000
  4882.       Y$ = ""
  4883.       DELAY! = FN TI! + 2
  4884. 20840 IF NOT EOF(3) THEN _
  4885.          Y$ = INPUT$(LOC(3),3) : _
  4886.          RETURN
  4887. 20850 IF FN TI! < DELAY! THEN _
  4888.          GOTO 20840
  4889.       Y$ = ""
  4890.       RETURN
  4891. '
  4892. ' *****************************************************************************
  4893. ' *  XMODEM UPLOAD                                                            *
  4894. ' *****************************************************************************
  4895. '
  4896. 20860 GOSUB 20992
  4897.       IF NOT EIGHT.BIT THEN _
  4898.          GOSUB 21280
  4899. 20900 X$ = ""
  4900.       SEC = 1
  4901.       CLOSE 2
  4902.       OPEN "R",2,FILE.NAME$,128
  4903.       FIELD 2,128 AS Z$
  4904.       IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  4905.          PRINT #3,NEGATIVE.ACKNOWLEDGE$;
  4906.       TRANSFER.ABORT! = FN TI! + WAIT.BEFORE.DISCONNECT
  4907. 20920 FOR X = 1 TO 5
  4908.         GOSUB 60000
  4909.         IF KEY.PRESSED$ = ESCAPE$ THEN _
  4910.            GOTO 21270
  4911.         GOSUB 20810
  4912. 20930   IF LEFT$(Y$,1) = START.OF.HEADER$ THEN _
  4913.            GOTO 21020
  4914. 20940   IF LEFT$(Y$,1) = END.TRANSMISSION$ THEN _
  4915.            GOTO 21220
  4916. 20950   IF LEFT$(Y$,1) = CANCEL$ THEN _
  4917.            GOTO 21230
  4918. 20960   IF Y$ <> "" THEN _
  4919.            GOSUB 21280 : _
  4920.            IF FN TI! < TRANSFER.ABORT! THEN _
  4921.               GOTO 20920 _
  4922.            ELSE GOTO 21230
  4923. 20970 NEXT
  4924.       IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  4925.          PRINT #3,NEGATIVE.ACKNOWLEDGE$;
  4926.       IF SNOOP THEN _
  4927.          PRINT "Upload Timeout"
  4928.       IF FN TI! > TRANSFER.ABORT! THEN _
  4929.          GOTO 21230
  4930. 20990 GOTO 20920
  4931. '
  4932. ' *****************************************************************************
  4933. ' *  CHANGE TO 8 BIT FOR XMODEM                                               *
  4934. ' *****************************************************************************
  4935. '
  4936. 20992 GOSUB 20510
  4937.       IF NOT EIGHT.BIT THEN _
  4938.          GOSUB 50510 : _
  4939.          OUT LINE.CONTROL.REGISTER,3
  4940. 20996 SO = 0
  4941.       RETURN
  4942. '
  4943. ' *****************************************************************************
  4944. ' *  XMODEM UPLOAD                                                            *
  4945. ' *****************************************************************************
  4946. '
  4947. 21000 GOSUB 20810
  4948.       IF Y$ = "" THEN _
  4949.          PRINT "Upload Timeout" : _
  4950.          GOTO 21040
  4951. 21020 X$ = X$ + Y$
  4952.       IF LEN(X$) < SOL THEN _
  4953.          GOTO 21000
  4954. 21040 IF LEN(X$) = SOL THEN _
  4955.          GOTO 21090
  4956. 21050 IF LEN(X$) > SOL THEN _
  4957.          GOTO 21180
  4958. 21060 IF X$ = END.TRANSMISSION$ THEN _
  4959.          GOTO 21220
  4960. 21070 IF X$ = CANCEL$ THEN _
  4961.          GOTO 21230
  4962. 21080 GOTO 21170
  4963. 21090 IF SEC <> ASC(MID$(X$,2,1)) THEN _
  4964.          GOTO 21200
  4965. 21100 IF (SEC XOR 255) <> ASC(MID$(X$,3,1)) THEN _
  4966.          GOTO 21210
  4967. 21110 IF FT$ = "X" THEN _
  4968.          WK$ = MID$(X$,4,128): _
  4969.          GOSUB 46000 _
  4970.       ELSE WK$ = MID$(X$,4): _
  4971.            GOSUB 46000
  4972. 21112 IF FT$ = "X" THEN _
  4973.          IF XMODEM.CHECKSUM <> ASC(MID$(X$,132,1)) THEN _
  4974.             GOTO 21190 _
  4975.          ELSE 21120
  4976. 21113 IF CRC.VALUE <> 0 THEN _
  4977.          GOTO 21191
  4978. 21120 SO = SO + 1
  4979. 21130 IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  4980.          PRINT #3,ACKNOWLEDGE$;
  4981. 21131 LSET Z$ = MID$(X$,4)
  4982.       PUT 2
  4983.       IF NOT OK THEN _
  4984.          GOTO 21230
  4985. 21145 SEC = 255 AND (SEC + 1)
  4986.       IF SNOOP THEN _
  4987.          LOCATE ,1 : _
  4988.          PRINT "Verified Rec Blk #";SO;
  4989. 21150 X$=""
  4990.       XMODEM.CHECKSUM = 0
  4991.       TRANSFER.ABORT! = FN TI! + 30
  4992.       GOTO 20920
  4993. 21170 A$ = "Short Blk in #"
  4994.       GOTO 21212
  4995. 21180 A$ = "Long Blk in #"
  4996.       GOTO 21212
  4997. 21190 A$ = "Checksum Error in #"
  4998.       GOTO 21212
  4999. 21191 A$="CRC Error": _
  5000.       GOTO 21212
  5001. 21200 A$ = "Blk # Error in #"
  5002.       IF SEC-1 <> ASC(MID$(X$,2,1)) THEN _
  5003.          GOTO 21212
  5004.       IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  5005.          PRINT #3,ACKNOWLEDGE$;
  5006.       GOTO 21150
  5007. 21210 A$ = "Complement Error in #"
  5008. 21212 IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  5009.          PRINT #3,NEGATIVE.ACKNOWLEDGE$;
  5010.       IF SNOOP THEN _
  5011.          PRINT LINE.FEED$;A$;SO + 1
  5012.       GOTO 21150
  5013. 21220 IF SNOOP THEN _
  5014.          PRINT LINE.FEED$;"File Closed"
  5015. 21225 IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  5016.          PRINT #3,ACKNOWLEDGE$;
  5017.       GOTO 21250
  5018. 21230 IF SNOOP THEN _
  5019.          PRINT LINE.FEED$;"Transfer Aborted"
  5020. 21240 OK = FALSE
  5021.       IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  5022.          PRINT #3,CANCEL$;CANCEL$;
  5023. 21250 IF NOT EIGHT.BIT THEN _
  5024.          EIGHT.BIT = TRUE
  5025.       RETURN
  5026. 21270 GOSUB 20510
  5027.       GOSUB 21280
  5028.       GOTO 21230
  5029. '
  5030. ' *****************************************************************************
  5031. ' *  CLEAR GARBAGE OUT OF COMMUNICATIONS BUFFER                               *
  5032. ' *****************************************************************************
  5033. '
  5034. 21280 WHILE NOT EOF(3)
  5035.         GOSUB 42000
  5036. 21281   DF$ = INPUT$(LOC(3),3)
  5037.       WEND
  5038.       RETURN
  5039. '
  5040. ' *****************************************************************************
  5041. ' *  XMODEM DOWNLOAD                                                          *
  5042. ' *****************************************************************************
  5043. '
  5044. 21300 GOSUB 20992
  5045.       SEC = 0
  5046.       GOSUB 21280
  5047.       FIELD 2,128 AS X$
  5048.       NEGATIVE.ACKNOWLEDGE$=CHR$(21)
  5049.       TRANSFER.ABORT! = FN TI! + WAIT.BEFORE.DISCONNECT
  5050. 21350 WHILE NOT EOF(3)
  5051. 21360   Y$ = INPUT$(1,3)
  5052.         IF Y$ = CANCEL$ THEN _
  5053.            GOTO 21560
  5054. 21380   IF Y$ = NEGATIVE.ACKNOWLEDGE$ THEN _
  5055.            FF = 3: _
  5056.            FT$ = "X": _
  5057.            GOTO 21480 _
  5058.         ELSE IF Y$ = "C" THEN _
  5059.            FF = 4: _
  5060.            FT$ = "C": _
  5061.            GOTO 21480
  5062. 21390 WEND
  5063.       GOSUB 21460
  5064.       IF FN TI! < TRANSFER.ABORT! THEN _
  5065.          GOTO 21350
  5066.       GOTO 21455
  5067. 21410 TRANSFER.ABORT! = FN TI! + WAIT.BEFORE.DISCONNECT
  5068. 21415 WHILE NOT EOF(3)
  5069. 21420   Y$ = INPUT$(1,3)
  5070.         IF Y$ = ACKNOWLEDGE$ THEN _
  5071.            GOTO 21470
  5072. 21440   IF Y$ <> NEGATIVE.ACKNOWLEDGE$ THEN _
  5073.            GOTO 21450
  5074. 21443   IF SNOOP THEN _
  5075.            PRINT LINE.FEED$;"Error -> retrans #";SO
  5076. 21445   SO = SO-1
  5077.         GOTO 21490
  5078. 21450   IF Y$ = CANCEL$ THEN _
  5079.            GOTO 21560
  5080.         IF FN TI! > TRANSFER.ABORT! THEN _
  5081.            GOTO 21455
  5082. 21451 WEND
  5083.       GOSUB 21460
  5084.       IF FN TI! < TRANSFER.ABORT! THEN _
  5085.          GOTO 21410
  5086. 21455 IF SNOOP THEN _
  5087.          PRINT "Download timeout"
  5088.       GOTO 21560
  5089. 21460 GOSUB 42000
  5090.       GOSUB 60000
  5091.       IF KEY.PRESSED$ = ESCAPE$ THEN _
  5092.          RETURN 21540
  5093.       RETURN
  5094. 21470 IF SNOOP THEN _
  5095.          LOCATE ,1 : PRINT "Verified Sent Block #";SO;
  5096. 21480 IF LOC(2) < LOF(2) / 128 THEN _
  5097.          GET 2 : _
  5098.          SEC = 255 AND (SEC + 1) : _
  5099.          GOTO 21490
  5100. 21482 IF SNOOP THEN _
  5101.          PRINT LINE.FEED$;"End of file"
  5102. 21485 GOTO 21530
  5103. 21490 SO = SO + 1
  5104.       IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  5105.          PRINT #3,START.OF.HEADER$; CHR$(SEC); CHR$(SEC XOR 255);X$;
  5106. 21503 IF FT$ = "X" THEN _
  5107.          WK$=X$ _
  5108.       ELSE WK$ = X$ + CHR$(0) + CHR$(0)
  5109. 21504 GOSUB 46000
  5110. 21510 IF FT$ = "X" AND INP(MODEM.STATUS.REGISTER) > 127 THEN _
  5111.          PRINT#3,CHR$(XMODEM.CHECKSUM); _
  5112.       ELSE IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  5113.               PRINT#3,CHR$(CRC.HIGH);CHR$(CRC.LOW);
  5114.       GOSUB 21280
  5115.       GOTO 21410
  5116. '
  5117. ' *****************************************************************************
  5118. ' *  END-OF-FILE FOR XMODEM DOWNLOADS -- SEND THE "EOT" CHARACTER AND WAIT UP *
  5119. ' *  TO 2 SECONDS FOR A POSITIVE RESPONSE (I.E. AN "ACK").  IF NONE IS        *
  5120. ' *  RE-TRY UP TO 10 TIMES.  IF NO POSITIVE RESPONSE IS RECEIVED AFTER TEN    *
  5121. ' *  ATTEMPTS, ASSUME THE DOWNLOAD WAS UNSUCCESSFULL.                         *
  5122. ' *****************************************************************************
  5123. '
  5124. 21530 IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  5125.          PRINT #3,END.TRANSMISSION$;
  5126.       FOR X = 1 TO 10
  5127.           GOSUB 20810
  5128.           IF INSTR(Y$,ACKNOWLEDGE$) THEN _
  5129.              GOTO 21550
  5130.           GOSUB 60000
  5131.           IF KEY.PRESSED$ = ESCAPE$ THEN _
  5132.              GOTO 21540
  5133. 21535 NEXT
  5134.       DOWNLOAD.COMPLETED = FALSE
  5135.       GOTO 21230
  5136. 21540 GOSUB 20510
  5137. 21545 Y$ = CANCEL$
  5138.       IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  5139.          PRINT #3,CANCEL$;CANCEL$;
  5140.       DOWNLOAD.COMPLETED = FALSE
  5141.       GOTO 21250
  5142. 21550 DOWNLOAD.COMPLETED = TRUE
  5143.       GOTO 21250
  5144. 21560 DOWNLOAD.COMPLETED = FALSE
  5145.       IF SNOOP THEN _
  5146.          PRINT LINE.FEED$;"Receiver aborted transfer"
  5147.       GOTO 21545
  5148. '
  5149. ' *****************************************************************************
  5150. ' *  MANUAL SELECT OF TRANSFER PROTOCAL                                       *
  5151. ' *****************************************************************************
  5152. '
  5153. 21600 CR = 0
  5154.       A$ = T$
  5155.       GOSUB 1500
  5156.       IF Q = 0 THEN _
  5157.          GOTO 21600
  5158.       Z$ = B$(1)
  5159. '
  5160. ' *****************************************************************************
  5161. ' *  DEFAULT SELECT OF TRANSFER PROTOCAL                                      *
  5162. ' *****************************************************************************
  5163. '
  5164. 21610 Z$ = FN UC$(Z$)
  5165.       FF = INSTR("AMXCQ",Z$)
  5166.       IF FF < 1 OR (FF = 2 AND NOT MNP.SUPPORT) THEN _
  5167.          GOTO 21600
  5168.       FT$ = MID$("AMXC ",FF,1)
  5169.       RETURN
  5170. 21620 FF = -1
  5171.       IF Q > 2 THEN _
  5172.          Z$ = B$(3) : _
  5173.          GOTO 21610
  5174.       IF USER.TRANSFER.DEFAULT$ > " " THEN _
  5175.          Z$ = USER.TRANSFER.DEFAULT$ : _
  5176.          GOTO 21610
  5177.       FF = 0
  5178.       RETURN
  5179. '
  5180. ' *****************************************************************************
  5181. ' *  LOCK AND OPEN MESSAGES FILE                                              *
  5182. ' *****************************************************************************
  5183. '
  5184. 21990 GOSUB 22000
  5185.       GOSUB 30500
  5186.       RETURN
  5187. '
  5188. ' *****************************************************************************
  5189. ' *  UNLOCK USERS AND MESSAGES                                                *
  5190. ' *****************************************************************************
  5191. '
  5192. 21995 GOSUB 27000
  5193.       GOSUB 25000
  5194.       RETURN
  5195. '
  5196. ' *****************************************************************************
  5197. ' *  FLUSH MESSAGE RECORD TO DISK AND UNLOCK MESSAGES                         *
  5198. ' *****************************************************************************
  5199. '
  5200. 21996 GOSUB 30000
  5201.       GOSUB 25000
  5202.       RETURN
  5203. '
  5204. ' *****************************************************************************
  5205. ' *  LOCK USER FILE BLOCK OF 4 RECORDS AND OPEN USER FILE                     *
  5206. ' *****************************************************************************
  5207. '
  5208. 21997 GOSUB 26500
  5209.       GOSUB 9400
  5210.       RETURN
  5211. '
  5212. ' *****************************************************************************
  5213. ' *  LOCK MESSAGE FILE                                                        *
  5214. ' *****************************************************************************
  5215. '
  5216. 22000 MESSAGE.FILE.LOCK = TRUE
  5217.       MID$(LOCK.STATUS$,1,2) = "LM"
  5218.       GOSUB 950
  5219.       LOCK.FILE.NAME$ = ACTIVE.MESSAGE.FILE$
  5220.       ON NETWORK.TYPE GOTO 22100,22200,22300
  5221.       RETURN
  5222. '
  5223. ' *****************************************************************************
  5224. ' *  LOCK MESSAGE FILE (MULTI-LINK)                                           *
  5225. ' *****************************************************************************
  5226. '
  5227. 22100 AX = &H0
  5228.       BX = &H1
  5229.       GOSUB 60510
  5230.       RETURN
  5231. '
  5232. ' *****************************************************************************
  5233. ' *  LOCK MESSAGE FILE (OMNINET)                                              *
  5234. ' *****************************************************************************
  5235. '
  5236. 22200 CC$ = CHR$(1) + MID$(ACTIVE.MESSAGE.FILE$ + SPACE$(8),3,8)
  5237.       GOSUB 28000
  5238.       IF CT = 0 THEN _
  5239.          RETURN
  5240.       GOSUB 50500
  5241.       GOTO 22200
  5242. '
  5243. ' *****************************************************************************
  5244. ' *  LOCK MESSAGE FILE (ORCHID PC-NET)                                        *
  5245. ' *  LOCK USER FILE (ORCHID PC-NET)                                           *
  5246. ' *  LOCK UPLOAD DIRECTORY OR COMMENTS BASED ON EN$ (ORCHID PC-NET)           *
  5247. ' *****************************************************************************
  5248. '
  5249. 22300 GOSUB 28100
  5250.       CALL LPLKIT(LOCK.DRIVE,LOCK.FILE.NAME$,A)
  5251.       RETURN
  5252. '
  5253. ' *****************************************************************************
  5254. ' *  GET MESSAGE HEADER RECORD DATA                                           *
  5255. ' *****************************************************************************
  5256. '
  5257. 23000 GET 1,1
  5258.       HIGH.MESSAGE.NUMBER = VAL(LEFT$(MESSAGE.RECORD$,8))
  5259.       CALLS.TODATE! = VAL(MID$(MESSAGE.RECORD$,11,10))
  5260.       CURRENT.USER.COUNT = VAL(MID$(MESSAGE.RECORD$,57,5))
  5261.       HIGHEST.USER.RECORD = VAL(MID$(MESSAGE.RECORD$,62,5))
  5262.       FIRST.MESSAGE.RECORD = VAL(MID$(MESSAGE.RECORD$,68,7))
  5263.       NEXT.MESSAGE.RECORD = VAL(MID$(MESSAGE.RECORD$,75,7))
  5264.       HIGHEST.MESSAGE.RECORD = VAL(MID$(MESSAGE.RECORD$,82,7))
  5265.       NODES.IN.SYSTEM = VAL(MID$(MESSAGE.RECORD$,127))
  5266.       IF NOT SYSOP AND NOT LOCAL.USER THEN RETURN
  5267.       IF LAST.MESSAGE.READ < VAL(MID$(MESSAGE.RECORD$,123,4)) THEN _
  5268.          LAST.MESSAGE.READ = VAL(MID$(MESSAGE.RECORD$,123,4))
  5269.       LAST.MESSAGE.READ = - LAST.MESSAGE.READ * _
  5270.                       (LAST.MESSAGE.READ <= HIGH.MESSAGE.NUMBER)
  5271.       RETURN
  5272. '
  5273. '
  5274. ' *****************************************************************************
  5275. ' *  UPDATE MESSAGE HEADER RECORD DATA                                        *
  5276. ' *****************************************************************************
  5277. '
  5278. 24000 MID$(MESSAGE.RECORD$,1,8) = STR$(HIGH.MESSAGE.NUMBER)
  5279.       MID$(MESSAGE.RECORD$,11,10) = STR$(CALLS.TODATE!)
  5280.       MID$(MESSAGE.RECORD$,57,5) = STR$(CURRENT.USER.COUNT)
  5281.       MID$(MESSAGE.RECORD$,62,5) = STR$(HIGHEST.USER.RECORD)
  5282.       MID$(MESSAGE.RECORD$,68,7) = STR$(FIRST.MESSAGE.RECORD)
  5283.       MID$(MESSAGE.RECORD$,75,7) = STR$(NEXT.MESSAGE.RECORD)
  5284.       MID$(MESSAGE.RECORD$,82,7) = STR$(HIGHEST.MESSAGE.RECORD)
  5285.       PUT 1,1
  5286.       RETURN
  5287. '
  5288. ' *****************************************************************************
  5289. ' *  UNLOCK MESSAGE FILE                                                      *
  5290. ' *****************************************************************************
  5291. '
  5292. 25000 MESSAGE.FILE.LOCK = FALSE
  5293.       MID$(LOCK.STATUS$,1,2) = "UM"
  5294.       GOSUB 950
  5295.       LOCK.FILE.NAME$ = ACTIVE.MESSAGE.FILE$
  5296.       ON NETWORK.TYPE GOTO 25100,25200,25300
  5297.       RETURN
  5298. '
  5299. ' *****************************************************************************
  5300. ' *  UNLOCK MESSAGE FILE (MULTI-LINK)                                         *
  5301. ' *****************************************************************************
  5302. '
  5303. 25100 AX = &H100
  5304.       BX = &H1
  5305.       GOSUB 60510
  5306.       RETURN
  5307. '
  5308. ' *****************************************************************************
  5309. ' *  UNLOCK MESSAGE FILE (OMNINET)                                            *
  5310. ' *****************************************************************************
  5311. '
  5312. 25200 CC$ = CHR$(17) + MID$(ACTIVE.MESSAGE.FILE$ + SPACE$(8),3,8)
  5313.       GOSUB 28000
  5314.       IF CT = 128 THEN _
  5315.          RETURN
  5316.       GOSUB 50500
  5317.       GOTO 25200
  5318. '
  5319. ' *****************************************************************************
  5320. ' *  UNLOCK MESSAGE FILE (ORCHID PC-NET)                                      *
  5321. ' *  UNLOCK USER FILE (ORCHID PC-NET)                                         *
  5322. ' *  UNLOCK UPLOAD DIRECTORY OR COMMENTS BASED ON EN$ (ORCHID PC-NET)         *
  5323. ' *****************************************************************************
  5324. '
  5325. 25300 GOSUB 28100
  5326.       CALL UNLOKIT(LOCK.DRIVE,LOCK.FILE.NAME$,A)
  5327.       RETURN
  5328. '
  5329. ' *****************************************************************************
  5330. ' *  LOCK USER FILE                                                           *
  5331. ' *****************************************************************************
  5332. '
  5333. 26000 USER.FILE.LOCK = TRUE
  5334.       MID$(LOCK.STATUS$,4,2) = "LU"
  5335.       GOSUB 950
  5336.       LOCK.FILE.NAME$ = ACTIVE.USER.FILE$
  5337.       ON NETWORK.TYPE GOTO 26100,26200,22300
  5338.       RETURN
  5339. '
  5340. ' *****************************************************************************
  5341. ' *  LOCK USER FILE (MULTI-LINK)                                              *
  5342. ' *****************************************************************************
  5343. '
  5344. 26100 AX = &H0
  5345.       BX = &H2
  5346.       GOSUB 60510
  5347.       RETURN
  5348. '
  5349. ' *****************************************************************************
  5350. ' *  LOCK USER FILE (OMNINET)                                                 *
  5351. ' *****************************************************************************
  5352. '
  5353. 26200 CC$ = CHR$(1) + MID$(ACTIVE.USER.FILE$ + SPACE$(8),3,8)
  5354.       GOSUB 28000
  5355.       IF CT = 0 THEN _
  5356.          RETURN
  5357.       GOSUB 50500
  5358.       GOTO 26200
  5359. '
  5360. ' *****************************************************************************
  5361. ' *  LOCK 4 RECORD BLOCK IN USER FILE                                         *
  5362. ' *****************************************************************************
  5363. '
  5364. 26500 USER.BLOCK.LOCK = TRUE
  5365.       BLK = (USER.FILE.INDEX / 4) + .26
  5366.       MID$(LOCK.STATUS$,7,2) = "LB"
  5367.       GOSUB 950
  5368.       ON NETWORK.TYPE GOTO 26600,26700,26800
  5369.       RETURN
  5370. '
  5371. ' *****************************************************************************
  5372. ' *  LOCK 4 RECORD BLOCK IN USER FILE (MULTI-LINK)                            *
  5373. ' *****************************************************************************
  5374. '
  5375. 26600 AX = &H0
  5376.       BX = BLK + 10
  5377.       GOSUB 60510
  5378.       RETURN
  5379. '
  5380. ' *****************************************************************************
  5381. ' *  LOCK 4 RECORD BLOCK IN USER FILE (OMNINET)                               *
  5382. ' *****************************************************************************
  5383. '
  5384. 26700 CC$ = CHR$(1) + FN BL$
  5385.       GOSUB 28000
  5386.       IF CT = 0 THEN _
  5387.          RETURN
  5388.       GOSUB 50500
  5389.       GOTO 26700
  5390. '
  5391. ' *****************************************************************************
  5392. ' *  LOCK 4 RECORD BLOCK IN USER FILE (ORCHID PC-NET)                         *
  5393. ' *****************************************************************************
  5394. '
  5395. 26800 LOCK.FILE.NAME$ = LEFT$(ACTIVE.USER.FILE$,2) + FN BL$
  5396.       GOTO 22300
  5397. '
  5398. ' *****************************************************************************
  5399. ' *  UNLOCK USER FILE                                                         *
  5400. ' *****************************************************************************
  5401. '
  5402. 27000 USER.FILE.LOCK = FALSE
  5403.       MID$(LOCK.STATUS$,4,2) = "UU"
  5404.       GOSUB 950
  5405.       LOCK.FILE.NAME$ = ACTIVE.USER.FILE$
  5406.       ON NETWORK.TYPE GOTO 27100,27200,25300
  5407.       RETURN
  5408. '
  5409. ' *****************************************************************************
  5410. ' *  UNLOCK USER FILE (MULTI-LINK)                                            *
  5411. ' *****************************************************************************
  5412. '
  5413. 27100 AX = &H100
  5414.       BX = &H2
  5415.       GOSUB 60510
  5416.       RETURN
  5417. '
  5418. ' *****************************************************************************
  5419. ' *  UNLOCK USER FILE (OMNINET)                                               *
  5420. ' *****************************************************************************
  5421. '
  5422. 27200 CC$ = CHR$(17) + MID$(ACTIVE.USER.FILE$ + SPACE$(8),3,8)
  5423.       GOSUB 28000
  5424.       IF CT = 128 THEN _
  5425.          RETURN
  5426.       GOSUB 50500
  5427.       GOTO 27200
  5428. '
  5429. ' *****************************************************************************
  5430. ' *  UNLOCK 4 RECORD BLOCK IN USER FILE                                       *
  5431. ' *****************************************************************************
  5432. '
  5433. 27500 USER.BLOCK.LOCK = FALSE
  5434.       BLK = (USER.FILE.INDEX / 4) + .26
  5435.       MID$(LOCK.STATUS$,7,2) = "UB"
  5436.       GOSUB 950
  5437.       ON NETWORK.TYPE GOTO 27600,27700,27800
  5438.       RETURN
  5439. '
  5440. ' *****************************************************************************
  5441. ' *  UNLOCK 4 RECORD BLOCK IN USER FILE (MULTI-LINK)                          *
  5442. ' *****************************************************************************
  5443. '
  5444. 27600 AX = &H100
  5445.       BX = BLK + 10
  5446.       GOSUB 60510
  5447.       RETURN
  5448. '
  5449. ' *****************************************************************************
  5450. ' *  UNLOCK 4 RECORD BLOCK IN USER FILE (OMNINET)                             *
  5451. ' *****************************************************************************
  5452. '
  5453. 27700 CC$ = CHR$(17) + FN BL$
  5454.       GOSUB 28000
  5455.       IF CT = 128 THEN _
  5456.          RETURN
  5457.       GOSUB 50500
  5458.       GOTO 27700
  5459. '
  5460. ' *****************************************************************************
  5461. ' *  UNLOCK 4 RECORD BLOCK IN USER FILE (ORCHID PC-NET)                       *
  5462. ' *****************************************************************************
  5463. '
  5464. 27800 LOCK.FILE.NAME$ = LEFT$(ACTIVE.USER.FILE$,2) + FN BL$
  5465.       GOTO 25300
  5466. '
  5467. ' *****************************************************************************
  5468. ' *  CORVUS OMNINET INTERFACE                                                 *
  5469. ' *****************************************************************************
  5470. '
  5471. 28000 CC$ = LINE.FEED$ + CHR$(0) + CHR$(11) + CC$
  5472.       CALL CDSEND(CC$)
  5473.       CALL CDRECV(CN$)
  5474.       CT = ASC(MID$(CN$,3,1))
  5475.       IF CT >= 128 THEN _
  5476.          PRINT "CORVUS LOCK FAIL" : _
  5477.          GOTO 31000
  5478. 28010 CT = ASC(MID$(CN$,4,1))
  5479.       IF CT >= 129 THEN _
  5480.          PRINT "CORVUS FULL" : _
  5481.          GOTO 31000
  5482.       RETURN
  5483. '
  5484. ' *****************************************************************************
  5485. ' *  ORCHID PC-NET INTERFACE                                                  *
  5486. ' *****************************************************************************
  5487. '
  5488. 28100 LOCK.DRIVE = ASC(LEFT$(ACTIVE.USER.FILE$,1))-ASC("A")
  5489.       LOCK.FILE.NAME$ = LOCK.FILE.NAME$ + _
  5490.                         STRING$(32-LEN(LOCK.FILE.NAME$),0)
  5491.       A = 0
  5492.       RETURN
  5493. '
  5494. ' *****************************************************************************
  5495. ' *  LOCK UPLOAD DIRECTORY OR COMMENTS BASED ON EN$                           *
  5496. ' *****************************************************************************
  5497. '
  5498. 29000 MID$(LOCK.STATUS$,10,2) = "LD"
  5499.       GOSUB 950
  5500.       LOCK.FILE.NAME$ = EN$
  5501.       ON NETWORK.TYPE GOTO 29100,29010,22300
  5502. 29010 RETURN
  5503. '
  5504. ' *****************************************************************************
  5505. ' *  LOCK UPLOAD DIRECTORY OR COMMENTS BASED ON EN$ (MULTI-LINK)              *
  5506. ' *****************************************************************************
  5507. '
  5508. 29100 AX = &H0
  5509.       BX = &H3
  5510.       GOSUB 60510
  5511.       RETURN
  5512. '
  5513. ' *****************************************************************************
  5514. ' *  UNLOCK UPLOAD DIRECTORY OR COMMENTS BASED ON EN$                         *
  5515. ' *****************************************************************************
  5516. '
  5517. 29500 MID$(LOCK.STATUS$,10,2) = "UD"
  5518.       GOSUB 950
  5519.       LOCK.FILE.NAME$ = EN$
  5520.       ON NETWORK.TYPE GOTO 29600,29510,25300
  5521. 29510 RETURN
  5522. '
  5523. ' *****************************************************************************
  5524. ' *  UNLOCK UPLOAD DIRECTORY OR COMMENTS BASED ON EN$ (MULTI-LINK)            *
  5525. ' *****************************************************************************
  5526. '
  5527. 29600 AX = &H100
  5528.       BX = &H3
  5529.       GOSUB 60510
  5530.       RETURN
  5531. '
  5532. ' *****************************************************************************
  5533. ' *  FLUSH MESSAGE FILE DATA TO DISK BY OPENING DUMMY FILE # 1                *
  5534. ' *****************************************************************************
  5535. '
  5536. 30000 CLOSE 1
  5537.       IF SHARE.IT THEN _
  5538.          OPEN CONFIG.FILENAME$ FOR INPUT SHARED AS #1 _
  5539.          ELSE OPEN "I",1,CONFIG.FILENAME$
  5540.       CLOSE 1
  5541.       RETURN
  5542. '
  5543. ' *****************************************************************************
  5544. ' *  OPEN AND DEFINE MESSAGE FILE                                             *
  5545. ' *****************************************************************************
  5546. '
  5547. 30500 CLOSE 1
  5548.       IF SHARE.IT THEN _
  5549.          OPEN ACTIVE.MESSAGE.FILE$ FOR RANDOM SHARED AS #1 _
  5550.          ELSE OPEN "R",1,ACTIVE.MESSAGE.FILE$
  5551.       FIELD 1,128 AS MESSAGE.RECORD$
  5552.       RETURN
  5553. '
  5554. ' *****************************************************************************
  5555. ' * F1 - COMMAND FROM LOCAL KEYBOARD (IMMEDIATE EXIT TO DOS)                  *
  5556. ' *****************************************************************************
  5557. '
  5558. 31000 IF MULTI.LINK.PRESENT THEN _
  5559.          GOSUB 60500
  5560.       SYSTEM
  5561. '
  5562. ' *****************************************************************************
  5563. ' * F2 - COMMAND FROM LOCAL KEYBOARD (SYSOP EXIT TO DOS AND RETURN)           *
  5564. ' *****************************************************************************
  5565. '
  5566. 32000 IF NOT LOCAL.USER THEN _
  5567.          A$="Sysop has exited to DOS. Please stand by for a few seconds." : _
  5568.          GOSUB 1399 : _
  5569.          GOSUB 50510
  5570.       SHELL DISK.FOR.DOS$+"COMMAND"
  5571.       CLS
  5572.       IF NOT LOCAL.USER THEN _
  5573.          GOSUB 42010 : _
  5574.          GOSUB 49000 : _
  5575.          A$ = "Sysop has returned from DOS.  Thanks for waiting." : _
  5576.          GOSUB 1400
  5577.       RETURN
  5578. '
  5579. ' *****************************************************************************
  5580. ' * F3 - COMMAND FROM LOCAL KEYBOARD (PRINTER TOGGLE)                         *
  5581. ' *****************************************************************************
  5582. '
  5583. 33000 PRINTER = NOT PRINTER
  5584.       CHANGE.VALUE = PRINTER
  5585.       FIELD.POSITION = 38
  5586.       GOTO 33950
  5587. '
  5588. ' *****************************************************************************
  5589. ' * F4 - COMMAND FROM LOCAL KEYBOARD (SYSOP ANNOY)                            *
  5590. ' *****************************************************************************
  5591. '
  5592. 33040 SYSOP.ANNOY = NOT SYSOP.ANNOY
  5593.       CHANGE.VALUE = SYSOP.ANNOY
  5594.       FIELD.POSITION = 34
  5595.       GOTO 33950
  5596. '
  5597. ' *****************************************************************************
  5598. ' * F5 - COMMAND FROM LOCAL KEYBOARD (FORCE CALLER ONLINE)                    *
  5599. ' *****************************************************************************
  5600. '
  5601. 33060 RETURN 320
  5602. '
  5603. ' *****************************************************************************
  5604. ' * F6 - COMMAND FROM LOCAL KEYBOARD (SYSOP AVAILABLE TOGGLE)                 *
  5605. ' *  6 - COMMAND FROM SYSOP MENU (SYSOP AVAILABLE TOGGLE)                     *
  5606. ' *****************************************************************************
  5607. '
  5608. 33070 SYSOP.AVAILABLE = NOT SYSOP.AVAILABLE
  5609.       CHANGE.VALUE = SYSOP.AVAILABLE
  5610.       FIELD.POSITION = 32
  5611.       GOTO 33950
  5612. '
  5613. ' *****************************************************************************
  5614. ' * F7 - COMMAND FROM LOCAL KEYBOARD (SYSOP GETS SYSTEM NEXT)                 *
  5615. ' *****************************************************************************
  5616. '
  5617. 33090 IF ERR=61 AND NOT DISKFULL.GO.OFFLINE THEN RETURN
  5618.       SYSOP.NEXT = NOT SYSOP.NEXT
  5619.       CHANGE.VALUE = SYSOP.NEXT
  5620.       FIELD.POSITION = 36
  5621.       GOTO 33950
  5622. '
  5623. ' *****************************************************************************
  5624. ' * F8 - COMMAND FROM LOCAL KEYBOARD (ASSIGN USER TEMPORARY SYSOP SECURITY)   *
  5625. ' *****************************************************************************
  5626. '
  5627. 33110 SYSOP = NOT SYSOP
  5628.       CURSOR.LINE = CSRLIN
  5629.       CURSOR.ROW = POS(0)
  5630.       LOCATE 25,1
  5631.       PRINT SPACE$(79);
  5632.       LOCATE 25,1
  5633.       USER.SECURITY.LEVEL = (1 + SYSOP) * _
  5634.                             USER.SECURITY.SAVE  - _
  5635.                             SYSOP * _
  5636.                             SYSOP.SECURITY.LEVEL
  5637.       PRINT "Temp SYSOP Privileges "; MID$("OFFON",1-3*SYSOP,3);
  5638.       GOSUB 50510
  5639.       LOCATE CURSOR.LINE,CURSOR.ROW
  5640.       GOSUB 49000
  5641.       RETURN
  5642. '
  5643. ' *****************************************************************************
  5644. ' * F9 - COMMAND FROM LOCAL KEYBOARD (SNOOP TOGGLE)                           *
  5645. ' *****************************************************************************
  5646. '
  5647. 33130 SNOOP = NOT SNOOP
  5648.       IF SNOOP THEN _
  5649.          LOCATE 23,1,0 : _
  5650.          PRINT "SNOOP ON" : _
  5651.          GOSUB 953 _
  5652.       ELSE LOCATE ,,0 : _
  5653.            CLS
  5654. 33140 CHANGE.VALUE = SNOOP
  5655.       FIELD.POSITION = 58
  5656.       GOTO 33950
  5657. '
  5658. ' *****************************************************************************
  5659. ' * F10 - COMMAND FROM LOCAL KEYBOARD (FORCE CHAT WITH USER)                  *
  5660. ' *****************************************************************************
  5661. '
  5662. 33150 IF ACTIVE.MENU$ = "M" OR _
  5663.          ACTIVE.MENU$ = "U" OR _
  5664.          ACTIVE.MENU$ = "F" THEN _
  5665.          GOTO 33160
  5666.       CURSOR.LINE = CSRLIN
  5667.       CURSOR.ROW = POS(0)
  5668.       LOCATE 25,1
  5669.       PRINT SPACE$(79);
  5670.       LOCATE 25,1
  5671.       PRINT "Cannot CHAT until user reaches MAIN menu";
  5672.       GOSUB 50500
  5673.       LOCATE CURSOR.LINE,CURSOR.ROW
  5674.       GOSUB 49000
  5675.       RETURN
  5676. 33160 Z$ = "Sysop initiated chat"
  5677.       GOSUB 13665
  5678.       A$ = "Hi, this is " + _
  5679.            SYSOP.FIRST.NAME$ + _
  5680.            " " + _
  5681.            SYSOP.LAST.NAME$ + _
  5682.            " in CHAT mode. Sorry to break in but.."
  5683.       GOSUB 1399
  5684.       GOTO 4770
  5685. '
  5686. ' *****************************************************************************
  5687. ' * UPDATE NODE RECORD WITH LOCAL FUNCTION KEY ACTIVITY                       *
  5688. ' *****************************************************************************
  5689. '
  5690. 33950 IF SNOOP THEN _
  5691.          GOSUB 49000
  5692. 33960 IF CONFERENCE.MODE = FALSE THEN _
  5693.          GOSUB 21990 : _
  5694.          GET 1,NODE.RECORD.INDEX : _
  5695.          MID$(MESSAGE.RECORD$,FIELD.POSITION,2) = STR$(CHANGE.VALUE) : _
  5696.          GOTO 43080
  5697. 40000 A$ = "Cannot change status during Conference!"
  5698.       GOSUB 1400
  5699.       RETURN
  5700. '
  5701. ' *****************************************************************************
  5702. ' * CALCULATE TIME REMAINING FOR USER                                         *
  5703. ' *****************************************************************************
  5704. '
  5705. 41000 GOSUB 41010
  5706.       IF BYPASS.TIME.CHECK THEN _
  5707.          RETURN
  5708.       IF TIME.REMAINING! < 0 THEN _
  5709.          TIME.REMAINING! = 0 : _
  5710.          RETURN 10553
  5711.       RETURN
  5712. 41010 TOA! = FRE("A")
  5713.       IF FN TI! > USER.LOGON.TIME! THEN _
  5714.          TCA! = FN TI! - USER.LOGON.TIME! _
  5715.       ELSE TCA! = FN TI! + 86400!-USER.LOGON.TIME!
  5716. 41020 TIME.REMAINING! = (SECONDS.PER.SESSION!-TCA!) / 60
  5717.       TIME.REMAINING$ = STR$(INT(TIME.REMAINING!))
  5718.       RETURN
  5719. '
  5720. ' *****************************************************************************
  5721. ' * DISPLAY TIME REMAINING FOR USER                                           *
  5722. ' *****************************************************************************
  5723. '
  5724. 41050 GOSUB 41000
  5725.       A$ = TIME.REMAINING$ + " minutes left"
  5726.       GOSUB 1398
  5727.       RETURN
  5728. '
  5729. ' *****************************************************************************
  5730. ' * SHOW USER CURRENT ACCESS LEVEL                                            *
  5731. ' *****************************************************************************
  5732. '
  5733. 41070 A$ = "Granted access level" + _
  5734.            STR$(USER.SECURITY.LEVEL) + _
  5735.            MID$(" (SYSOP)",1,-8*(USER.SECURITY.LEVEL >= SYSOP.SECURITY.LEVEL))
  5736.       GOSUB 1398
  5737.       RETURN
  5738. '
  5739. ' *****************************************************************************
  5740. ' *  CALCULATE CURRENT TIME FOR AM OR PM                                      *
  5741. ' *****************************************************************************
  5742. '
  5743. 41500 TIME.LOGGED.ON$ = TIME$
  5744.       CURRENT.DATE$ = LEFT$(DATE$ ,6) + RIGHT$(DATE$ ,2)
  5745. 41510 TIM$ = TIME$
  5746.       IF FN V(TIM$,1) = 12 THEN _
  5747.          MID$(TIM$,1,2) = RIGHT$(STR$(FN V(TIM$,1)),2) : _
  5748.          TIM$ = LEFT$(TIM$,5) + " PM" : _
  5749.          RETURN
  5750. 41520 IF FN V(TIM$,1) > 11 THEN _
  5751.          MID$(TIM$,1,2) = RIGHT$(STR$(FN V(TIM$,1)-12),2) : _
  5752.          TIM$ = LEFT$(TIM$,5) + " PM" : _
  5753.          RETURN
  5754.       TIM$ = LEFT$(TIM$,5) + " AM"
  5755.       RETURN
  5756. '
  5757. ' *****************************************************************************
  5758. ' * TEST FOR CARRIER PRESENT (DROP CALLER IF CARRIER NOT PRESENT)             *
  5759. ' *****************************************************************************
  5760. '
  5761. 42000 IF LOCAL.USER THEN _
  5762.          RETURN
  5763. 42010 IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  5764.          RETURN
  5765. '
  5766. ' *****************************************************************************
  5767. ' * IN CASE USER IS 2400 BAUD, PAUSE A SECOND AND CHECK AGAIN FOR CARRIER     *
  5768. ' * DETECT.  SOME 2400 BAUD MODEMS TAKE A WHILE TO SYNCHRONIZE THE CARRIER,   *
  5769. ' * HENCE A ONE-SECOND BEFORE CHECKING AGAIN.                                 *
  5770. ' *****************************************************************************
  5771. '   
  5772.       GOSUB 50500
  5773.       IF INP(MODEM.STATUS.REGISTER) > 127 THEN _
  5774.          RETURN
  5775.       Z$ = "Carrier dropped"
  5776.       GOSUB 13665
  5777.       GOTO 10595
  5778. '
  5779. ' *****************************************************************************
  5780. ' * NULLS SET FOR NEW USERS                                                   *
  5781. ' *****************************************************************************
  5782. '
  5783. 42700 A$ = "Want nulls (Y/N)"
  5784.       GOSUB 1500
  5785.       IF NO OR YES THEN _
  5786.          NULLS = NO _
  5787.       ELSE 42700
  5788. '
  5789. ' *****************************************************************************
  5790. ' *  N - COMMAND FROM UTILITY MENU (NULLS TOGGLE)                             *
  5791. ' *****************************************************************************
  5792. '
  5793. 42710 NULLS = NOT NULLS
  5794.       GOSUB 9520
  5795. 42720 A$ = "Nulls " + MID$("OffOn",1-3*NULLS,3)
  5796.       GOSUB 1405
  5797.       RETURN
  5798. '
  5799. ' *****************************************************************************
  5800. ' *  F - COMMAND FROM UTILITY MENU (FILE TRANSFER DEFALUT MODE)               *
  5801. ' *  FILE TRANSFER DEFAULT SET FOR NEW USERS                                  *
  5802. ' *****************************************************************************
  5803. '
  5804. 42800 T$ = "FILE transfer default" + TRANSFER.OPTIONS$
  5805.       GOSUB 21600
  5806.       USER.TRANSFER.DEFAULT$ = FT$
  5807. 42810 A$ = "PROTOCOL: " + MID$("Ascii MNP   XmodemCRC   None",6*FF-5,6)
  5808.       GOSUB 1405
  5809.       RETURN
  5810. '
  5811. ' *****************************************************************************
  5812. ' *  C - COMMAND FROM UTILITY MENU (CHANGE CASE TOGGLE)                       *
  5813. ' *  UPPER/LOWER CASE SET FOR NEW USERS                                       *
  5814. ' *****************************************************************************
  5815. '
  5816. 42950 A$ = "CAN YOUR TERMINAL DISPLAY LOWER CASE (Y/N)"
  5817.       GOSUB 1500
  5818.       IF NO OR YES THEN _
  5819.          UPPER.CASE = YES _
  5820.       ELSE 42950
  5821. 42960 UPPER.CASE = NOT UPPER.CASE
  5822.       A$ = "UPPER CASE " + MID$("and lowerONLY",1-9*UPPER.CASE,9)
  5823.       GOSUB 1405
  5824.       RETURN
  5825. '
  5826. ' *****************************************************************************
  5827. ' *  G - COMMAND FROM UTILITY MENU (GRAPHICS WANTED)                          *
  5828. ' *  GRAPHIC MENUS SELECTION SET FOR NEW USERS                                *
  5829. ' *****************************************************************************
  5830. '
  5831. 43000 IF NOT EIGHT.BIT THEN _
  5832.          A$ = "Graphics unavailable" : _
  5833.          GOSUB 1405 : _
  5834.          RETURN
  5835. 43005 A$ = "GRAPHICS wanted: <N>one,<A>scii,<C>olor,<H>elp"
  5836.       GOSUB 1500
  5837.       IF Q = 0 THEN _
  5838.          GOTO 43005
  5839.       GR = INSTR("NAC",FN UC$(B$(1)))
  5840.       IF GR = 0 THEN _
  5841.          USER.RECORD.SAVE$ = USER.RECORD$ : _
  5842.          FILE.NAME$ = HELP$(9) : _
  5843.          GOSUB 1790 : _
  5844.          GOSUB 9400 : _
  5845.          LSET USER.RECORD$ = USER.RECORD.SAVE$ : _
  5846.          GOTO 43005
  5847.       USER.GRAPHIC.DEFAULT$ = MID$(" GC",GR,-(GR > 1))
  5848.       GR = GR-1
  5849. 43020 A$ = "GRAPHICS: " + MID$("None AsciiColor",GR*5 + 1,5)
  5850.       GOSUB 1405
  5851.       RETURN
  5852. 43025 GOSUB 43030
  5853.       GOTO 45000
  5854. 43030 OK = FALSE
  5855. 43031 IF GR THEN _
  5856.          N$ = FILE.NAME$ : _
  5857.          GOSUB 20282 : _
  5858.          IF LEN(X$) < 8 THEN _
  5859.             DF$ = DR$ + _
  5860.                   ":" + _
  5861.                   X$ + _
  5862.                   USER.GRAPHIC.DEFAULT$ + _
  5863.                   "." + _
  5864.                   EXTENTION$ : _
  5865.             NAME DF$ AS DF$
  5866. 43032 IF OK THEN _
  5867.          FILE.NAME$ = DF$
  5868.       RETURN
  5869. 43040 IF INSTR(3,Z$,MID$(A$,3,(LEN(A$)-2))) THEN _
  5870.          RETURN 20245
  5871.       RETURN
  5872. '
  5873. ' *****************************************************************************
  5874. ' *  UPDATE CALLERS FILE AT LOGOFF                                            *
  5875. ' *****************************************************************************
  5876. '
  5877. 43050 FIELD 4,55 AS CALLERS.RECORD$,3 AS HOURS$,3 AS MINUTES$,3 AS SECONDS$ 'CPC131A7
  5878.       LSET CALLERS.RECORD$ = MID$(NG$,65,55)
  5879.       LSET HOURS$ = STR$(HHH)
  5880.       LSET MINUTES$ = STR$(MMM)
  5881.       LSET SECONDS$ = STR$(SSS)
  5882.       CALLERS.FILE.INDEX = CALLERS.FILE.INDEX + 1
  5883.       PUT 4,CALLERS.FILE.INDEX
  5884.       FIELD 4,64 AS CALLERS.RECORD$
  5885.       LSET CALLERS.RECORD$ = LEFT$(NG$,64)
  5886.       CALLERS.FILE.INDEX = CALLERS.FILE.INDEX + 1
  5887.       PUT 4,CALLERS.FILE.INDEX
  5888. 43060 LSET CALLERS.RECORD$ = STRING$(64,CHR$(0))
  5889.       PUT 4
  5890.       PUT 4
  5891.       IF FIRST.NAME$ = SYSOP.FIRST.NAME$ AND _
  5892.          LAST.NAME$ = SYSOP.LAST.NAME$ THEN _
  5893.          SYSOP = TRUE _
  5894.       ELSE SYSOP = FALSE
  5895. '
  5896. ' *****************************************************************************
  5897. ' *  SAVE USER PROFILE WHEN EXITING                                           *
  5898. ' *****************************************************************************
  5899. '
  5900. 43070 GOSUB 21990
  5901.       GET 1,NODE.RECORD.INDEX
  5902.       MID$(MESSAGE.RECORD$,40,2) = STR$(EXIT.TO.DOORS)
  5903.       MID$(MESSAGE.RECORD$,42,2) = STR$(EIGHT.BIT)
  5904.       MID$(MESSAGE.RECORD$,44,2) = STR$(BPS)
  5905.       MID$(MESSAGE.RECORD$,46,2) = STR$(UPPER.CASE)
  5906.       MID$(MESSAGE.RECORD$,48,5) = SPACE$(5)
  5907.       KG = TRUE
  5908.       GOSUB 41010
  5909.       MID$(MESSAGE.RECORD$,48,5) = STR$(TIME.REMAINING!)
  5910.       MID$(MESSAGE.RECORD$,53,2) = STR$(GR)
  5911.       MID$(MESSAGE.RECORD$,55,2) = STR$(SYSOP)
  5912. 43080 PUT 1,NODE.RECORD.INDEX
  5913.       GOSUB 21996
  5914.       GOSUB 30500
  5915.       RETURN
  5916. '
  5917. ' *****************************************************************************
  5918. ' *  RESTORE USER PROFILE WHEN RETURNING FROM DOORS                           *
  5919. ' *****************************************************************************
  5920. '
  5921. 44000 GET 1,NODE.RECORD.INDEX
  5922.       EIGHT.BIT = FN V(MESSAGE.RECORD$,42)
  5923.       BPS = FN V(MESSAGE.RECORD$,44)
  5924.       UPPER.CASE = FN V(MESSAGE.RECORD$,46)
  5925.       MINUTES.PER.SESSION! = VAL(MID$(MESSAGE.RECORD$,48,5))
  5926.       GR = FN V(MESSAGE.RECORD$,53)
  5927.       SYSOP = FN V(MESSAGE.RECORD$,55)
  5928.       IF BPS = -1 THEN _
  5929.          BAUD.RATE.DIVISOR = &H180:'                                   300 BAUD
  5930.       IF BPS = -2 THEN _
  5931.          BAUD.RATE.DIVISOR = &H100:'                                   450 BAUD
  5932. 44005 IF BPS = -3 THEN _
  5933.          BAUD.RATE.DIVISOR = &H60:'                                   1200 BAUD
  5934.       IF BPS = -4 THEN _
  5935.          BAUD.RATE.DIVISOR = &H30:'                                   2400 BAUD
  5936. 44010 GOSUB 1654
  5937.       USER.LOGON.TIME! = FN TI!
  5938.       IF MINUTES.PER.SESSION! < 1 THEN _
  5939.          MINUTES.PER.SESSION! = 3
  5940. 44015 IF NOT EIGHT.BIT THEN _
  5941.          OUT LINE.CONTROL.REGISTER,&H1A
  5942. 44020 IF SYSOP THEN _
  5943.          FIRST.NAME$ = SYSOP.PASSWORD.1$ : _
  5944.          LAST.NAME$ = SYSOP.PASSWORD.2$ : _
  5945.          RETURN
  5946. 44030 FIRST.NAME.END = INSTR(MESSAGE.RECORD$," ")
  5947.       LAST.NAME.END = INSTR(FIRST.NAME.END + 1,MESSAGE.RECORD$," ")
  5948.       FIRST.NAME$ = LEFT$(MESSAGE.RECORD$,FIRST.NAME.END-1)
  5949.       LAST.NAME$ = MID$(MESSAGE.RECORD$,FIRST.NAME.END + 1,LAST.NAME.END-(FIRST.NAME.END + 1))
  5950.       GOSUB 12550
  5951.       RETURN
  5952. '
  5953. ' *****************************************************************************
  5954. ' *  DISPLAY NON-BREAKABLE TEXT FILES                                         *
  5955. ' *****************************************************************************
  5956. '
  5957. 45000 STOP.INTERRUPTS = FALSE
  5958.       GOSUB 6000
  5959.       STOP.INTERRUPTS = TRUE
  5960.       RETURN
  5961. '
  5962. ' *****************************************************************************
  5963. ' * MAKE INPUT STRING HIDDEN (USE *'S TO ECHO INPUT)                          *
  5964. ' *****************************************************************************
  5965. '
  5966. 45010 HIDDEN = TRUE
  5967.       GOSUB 1500
  5968.       HIDDEN = FALSE
  5969.       GOSUB 1405
  5970.       RETURN
  5971. '
  5972. ' *****************************************************************************
  5973. ' *  XMODEM / CRC INTERFACE                                                   *
  5974. ' *****************************************************************************
  5975. '
  5976. 46000 XMODEM.CHECKSUM = 0
  5977.       CRC.VALUE = 0
  5978.       CALL XMODEM(WK$,XMODEM.CHECKSUM,CRC.VALUE,CRC.HIGH,CRC.LOW)
  5979.       RETURN
  5980. '
  5981. ' *****************************************************************************
  5982. ' *  BUILD LINE 25 DISPLAY                                                    *
  5983. ' *****************************************************************************
  5984. '
  5985. 49000 LINE.25$ = MID$("    AVL ",1-4*SYSOP.AVAILABLE,4) + _
  5986.                  MID$("    ANY ",1-4*SYSOP.ANNOY,4) + _
  5987.                  MID$("    LPT ",1-4*PRINTER,4) + _
  5988.                  MID$("SYS",1,-3*SYSOP.NEXT)
  5989.       GOSUB 950
  5990.       RETURN
  5991. '
  5992. ' *****************************************************************************
  5993. ' *  DISPLAY MESSAGE & COMMENT EDIT PROMPT LINE                               *
  5994. ' *****************************************************************************
  5995. '
  5996. 50400 A$ = "A)bort, C)ontinue, D)elete, E)dit, I)nsert, L)ist, M)argin, S)ave"
  5997.       GOSUB 1398
  5998.       RETURN
  5999. '
  6000. ' *****************************************************************************
  6001. ' *  1 SECOND DELAY                                                           *
  6002. ' *****************************************************************************
  6003. '
  6004. 50500 DELAY! = FN TI! + 1
  6005.       GOTO 50520
  6006. '
  6007. ' *****************************************************************************
  6008. ' *  3 SECOND DELAY                                                           *
  6009. ' *****************************************************************************
  6010. '
  6011. 50510 DELAY! = FN TI! + 3
  6012. 50520 IF FN TI! < DELAY! AND _
  6013.          DELAY! < 86400! THEN _
  6014.          GOTO 50520
  6015.       RETURN
  6016. '
  6017. ' *****************************************************************************
  6018. ' * UPDATE DOWNLOAD STATISTICS                                                *
  6019. ' *****************************************************************************
  6020. '
  6021. 50600 IF DOWNLOAD.COMPLETED THEN _
  6022.          DOWNLOADS = DOWNLOADS + 1 : _
  6023.          Y$ = " Downloaded " _
  6024.       ELSE Y$ = " Aborted "
  6025. 50610 IF LOCAL.USER THEN _
  6026.          RETURN 
  6027.       GOSUB 41510
  6028.       Z$ = FILE.NAME$ + Y$ + "at " + TIM$ + " using " + FT$
  6029.       GOSUB 13670
  6030.       IF LEFT$(B$(1),1) = "/" THEN _
  6031.          Z$ =  + "  file desc: " + B$(1) : _
  6032.          GOSUB 13670
  6033.       RETURN
  6034. '
  6035. ' *****************************************************************************
  6036. ' *  GET FREE SPACE ON DISK                                                   *
  6037. ' *****************************************************************************
  6038. '
  6039. 52000 CLS
  6040. 52001 FILES Z$
  6041.       FREE.SPACE$ = ""
  6042.       FOR X = 1 TO 25
  6043.         FREE.SPACE$ = FREE.SPACE$ + CHR$(SCREEN (3,X))
  6044.       NEXT
  6045.       GOSUB 49000
  6046.       RETURN
  6047. '
  6048. ' *****************************************************************************
  6049. ' *  SEND MODEM COMMAND                                                       *
  6050. ' *****************************************************************************
  6051. '
  6052. 52070 IF DUMB.MODEM THEN _
  6053.          RETURN
  6054.       IF COMMANDS.BETWEEN.RINGS THEN _
  6055.          WHILE(INP(MODEM.STATUS.REGISTER) AND &H40) : _
  6056.          WEND
  6057. 52075 GOSUB 50500
  6058.       PRINT #3,A$
  6059.       RETURN
  6060. '
  6061. ' *****************************************************************************
  6062. ' *   DIRECTORY SEARCH                                                        *
  6063. ' *****************************************************************************
  6064. '
  6065. 52900 CK = 2
  6066.       IF Q > 1 THEN _
  6067.          GOTO 52920
  6068. 52910 A$ = "Search for string (Press [ENTER] to quit)"
  6069.       GOSUB 1500
  6070.       IF Q = 0 THEN _
  6071.          RETURN
  6072.       B$(2) = B$(1)
  6073. 52920 RS$ = FN UC$(B$(2))
  6074.       A1$ = B$(2)
  6075.       GOTO 53007
  6076. '
  6077. ' *****************************************************************************
  6078. ' *  N - COMMAND FROM FILES MENU (DISPLAY NEW FILES SINCE LAST DIR DISPLAY)   *
  6079. ' *****************************************************************************
  6080. '
  6081. 53000 CK = 1
  6082.       IF Q > 1 THEN _
  6083.          GOTO 53005
  6084. 53002 A1$ = RIGHT$(LM$,4) + LEFT$(LM$,2)
  6085.       A$ = "Include files on/after (MMDDYY, [ENTER] = last date on " + A1$ + ")"
  6086.       GOSUB 1500
  6087.       IF Q = 0 THEN _
  6088.          RS$ = LM$ : _
  6089.          GOTO 53007
  6090.       B$(2) = B$(1)
  6091. 53005 IF LEN(B$(2)) <> 6 THEN _
  6092.          GOTO 53002
  6093.       A1$ = B$(2)
  6094.       RS$ = RIGHT$(A1$,2) + LEFT$(A1$,4)
  6095. 53007 IF Q > 2 THEN _
  6096.          B$(2) = B$(3) : _
  6097.          GOTO 53030
  6098. 53010 A$ = "Directory to scan or ALL"
  6099.       GOSUB 1500
  6100.       IF Q = 0 THEN _
  6101.          RETURN
  6102.       B$(2) = B$(1)
  6103. 53030 Q = 2
  6104.       LIST.DIRECTORY = TRUE
  6105.       LIST.NEW = TRUE
  6106.       Z$ = FN UC$(B$(2))
  6107.       IF Z$ = "ALL" THEN _
  6108.          GOTO 53070
  6109. 53060 GOSUB 20160
  6110.       LIST.NEW = FALSE
  6111.       RETURN
  6112. 53070 G = 2
  6113.       J = 2
  6114.       FOR SUBDIR.INDEX = 1 TO SUBDIR.COUNT + (NOT SYSOP)
  6115.         B$(2) = SUBDIR$(SUBDIR.INDEX) + _
  6116.                 "*." + _
  6117.                 DIRECTORY.EXTENTION$
  6118.         GOSUB 10720
  6119.         CLS
  6120.       NEXT
  6121.       GOSUB 49000
  6122.       QX = G
  6123.       X = 3
  6124.       GOSUB 20161
  6125.       LIST.NEW = FALSE
  6126.       RETURN
  6127. '
  6128. ' *****************************************************************************
  6129. ' *  OPEN AND DEFINE CALLERS FILE                                             *
  6130. ' *****************************************************************************
  6131. '
  6132. 56000 CLOSE 4
  6133.       OPEN "R",4,CALLERS.FILE$,64
  6134.       FIELD 4,64 AS CALLERS.RECORD$
  6135.       RETURN
  6136. '
  6137. ' *****************************************************************************
  6138. ' *  DISPLAY CALLERS FILE                                                     *
  6139. ' *****************************************************************************
  6140. '
  6141. 57000 GOSUB 1485
  6142.       CALLERS.FILE.INDEX.TEMP = CALLERS.FILE.INDEX
  6143. 57005 IF CALLERS.FILE.INDEX.TEMP  < 1 OR _
  6144.          RET THEN _
  6145.          RETURN
  6146. 57010 GET 4,CALLERS.FILE.INDEX.TEMP
  6147.       A$ = CALLERS.RECORD$
  6148.       IF LEFT$(A$,3) = SPACE$(3) OR _
  6149.          INSTR(A$,"on at") = 0 THEN _
  6150.          GOTO 57030
  6151. 57025 CALLERS.FILE.INDEX.TEMP = CALLERS.FILE.INDEX.TEMP -1
  6152.       GET 4,CALLERS.FILE.INDEX.TEMP
  6153.       A1$ = LEFT$(CALLERS.RECORD$,15)
  6154.       IF SYSOP OR _
  6155.          LEFT$(A1$,3) <> SPACE$(3) THEN _
  6156.          A$ = A$ + A1$
  6157. 57027 GOSUB 57100
  6158.       GOTO 57045
  6159. 57030 IF SYSOP THEN _
  6160.          GOSUB 57100
  6161. 57045 CALLERS.FILE.INDEX.TEMP = CALLERS.FILE.INDEX.TEMP -1
  6162.       GOTO 57005
  6163. 57100 GOSUB 1405
  6164. 57110 IF PAGE.LENGTH AND _
  6165.          Q >= 0 THEN _
  6166.          Q = Q + 1 : _
  6167.          IF Q >= PAGE.LENGTH THEN _
  6168.             GOSUB 5600 : _
  6169.             IF NO THEN _
  6170.                RETURN 57120 _
  6171.             ELSE Q = 0
  6172. 57120 RETURN
  6173. '
  6174. ' *****************************************************************************
  6175. ' * OPEN RBBS-PC'S "WORK FILE" (I.E. FILE NUMBER 2) FOR INPUT.  OPEN IT AS    *
  6176. ' * "SHARED" IF MULTIPLE COPIES OF RBBS-PC WILL BE RUNNING UNDER THE SAME DOS *
  6177. ' *****************************************************************************
  6178. '
  6179. 58000 CLOSE 2
  6180. 58010 BADNEWS=0
  6181. 58020 IF SHARE.IT THEN _
  6182.          OPEN FILE.NAME$ FOR INPUT SHARED AS #2 _
  6183.          ELSE OPEN FILE.NAME$ FOR INPUT AS #2
  6184. 58030 RETURN
  6185. '
  6186. ' *****************************************************************************
  6187. ' *  TEST FOR FUNCTION KEY PRESSED                                            *
  6188. ' *****************************************************************************
  6189. '
  6190. 60000 KEY.PRESSED$ = INKEY$
  6191.       IF LEN(KEY.PRESSED$) <> 2 THEN _
  6192.          RETURN
  6193. 60010 KEY.PRESSED = ASC(RIGHT$(KEY.PRESSED$,1))
  6194.       IF KEY.PRESSED < F1.KEY OR _
  6195.          KEY.PRESSED > F10.KEY THEN _
  6196.          RETURN
  6197.       FUNCTION.KEY = KEY.PRESSED - 58
  6198.       ON FUNCTION.KEY GOSUB 31000, _            ' F1
  6199.                             32000, _            ' F2
  6200.                             33000, _            ' F3
  6201.                             33040, _            ' F4
  6202.                             33060, _            ' F5
  6203.                             33070, _            ' F6
  6204.                             33090, _            ' F7
  6205.                             33110, _            ' F8
  6206.                             33130, _            ' F9
  6207.                             33150               ' F10
  6208.       RETURN
  6209. '
  6210. ' *****************************************************************************
  6211. ' *  MULTI-LINK DEQUEUE COM PORT                                              *
  6212. ' *****************************************************************************
  6213. '
  6214. 60500 AX = &H100
  6215. 60505 BX = -4
  6216.       IF COM.PORT$ = "COM2" THEN _
  6217.          BX = -3
  6218. '
  6219. ' *****************************************************************************
  6220. ' *  MULTI-LINK INTERFACE                                                     *
  6221. ' *****************************************************************************
  6222. '
  6223. 60510 CALL RBBSML(AX,BX)
  6224.       RETURN
  6225. '
  6226. ' *****************************************************************************
  6227. ' *  REPLY TO MESSAGE SAVE ORIGINAL ATTRIBUTES                                *
  6228. ' *****************************************************************************
  6229. '
  6230. 62520 SQ = Q
  6231.       LG$(10) = B$
  6232.       LINES.IN.MESSAGE.SAVE = LINES.IN.MESSAGE
  6233.       SL = S
  6234.       NON.STOP.SAVE = NON.STOP
  6235.       MESSAGE.DIM.INDEX.SAVE = MESSAGE.DIM.INDEX
  6236.       RETURN
  6237. '
  6238. ' *****************************************************************************
  6239. ' *  REPLY TO MESSAGE RESTORE ORIGINAL ATTRIBUTES                             *
  6240. ' *****************************************************************************
  6241. '
  6242. 62530 Q = SQ
  6243.       B$ = LG$(10)
  6244.       LINES.IN.MESSAGE = LINES.IN.MESSAGE.SAVE
  6245.       S = SL
  6246.       NON.STOP = NON.STOP.SAVE
  6247.       MESSAGE.DIM.INDEX = MESSAGE.DIM.INDEX.SAVE
  6248.       KILL.MESSAGE = FALSE
  6249.       RETURN
  6250.